1. 程式人生 > >Android基礎篇(三)——Android中的Activity簡單介紹

Android基礎篇(三)——Android中的Activity簡單介紹

一、Activity的基本介紹

Android應用中通常由一個或者多個基本元件組成,我們平時看到的Andrid應用中最常用的元件就是ActivityActivityBroadcastReceiverContentProviderService合稱Android的四大元件。

在我們建立完一個Android工程後會有以下檢視:

這個MainActivity就是我們AndroidStudio預設提供的activity

你要知道,專案中的任何活動都要重寫ActivityonCreate()方法,但目前的MainActivity內部去除掉不相干的程式碼後,內容如下:

public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}
    

可以看到,預設實現的onCreate()方法非常簡單,就是呼叫了父類的onCreate()方法。

Activity主要負責於和使用者互動,而談及與使用者互動則不得不說Android中的View元件了。View元件是所有UI控制元件、容器控制元件的基類,可以說View元件就是Android應用中使用者實實在在看到的部分。但View元件需要放到容器元件中,或者使用Activity將它顯示出來。如果我們需要通過某個Activity把指定的View顯示出來,呼叫ActivitysetContentView()方法即可。

setContentView()方法可接受一個View物件作為引數,例如:

//建立一個線性佈局管理器
LinearLayout layout = new LinearLayout(this);
//設定該Activity顯示Layout
setContentView(layout);

這兩行程式碼建立了一個LinearLayout物件(它是 ViewGroup的子類,ViewGroup又是View的子類),接著呼叫ActivitysetContentView(layout)把這個佈局管理器顯示出來。

我們經常使用setContentView()方法接受一個佈局管理器資源的ID作為引數,例如:

//設定該Activity顯示main.xml檔案定義的View
setContentView(R.layout.activity_main);

在初始程式碼中我們可以看到這一行程式碼:

setContentView(R.layout.activity_main);

這一行程式碼主要是說明當前activity引用的是activity_main佈局檔案,在Android專案中新增的任何資源都會在R檔案中生成一個相應的資源id,因此我們的activity_main.xml佈局檔案的id現在應該是已經新增到R檔案中了。在程式碼中引用佈局檔案的方法你也看到了,只需要呼叫R.layout.activity_main就可以得到activity_main.xml佈局的id,然後將這個值傳入setContentView()方法即可。注意這裡我們使用的R是我們工程包下面的R檔案,AndroidSDK還會自動提供一個android包下的R檔案,注意兩者是有區別的,別引用錯了。

一、Activity的生命週期

谷歌官方提供的Activity生命週期圖:

相信不少人已經看過這個流程圖,在此就不多做贅述,我簡單的說說這幾個過程:

1.啟動Activity:系統會先呼叫onCreate方法,然後呼叫onStart方法,最後呼叫onResumeActivity進入執行狀態。

2.當前Activity被其他Activity覆蓋其上或被鎖屏:系統會呼叫onPause方法,暫停當前Activity的執行。

3.當前Activity由被覆蓋狀態回到前臺或解鎖屏:系統會呼叫onResume方法,再次進入執行狀態。

4.當前Activity轉到新的Activity介面或按Home鍵回到主屏,自身退居後臺:系統會先呼叫onPause方法,然後呼叫onStop方法,進入停滯狀態。

5.使用者後退回到此Activity:系統會先呼叫onRestart方法,然後呼叫onStart方法,最後呼叫onResume方法,再次進入執行狀態。

6.當前Activity處於被覆蓋狀態或者後臺不可見狀態,即第2步和第4步,系統記憶體不足,殺死當前Activity,而後使用者退回當前Activity:再次呼叫onCreate方法、onStart方法、onResume方法,進入執行狀態。

7.使用者退出當前Activity:系統先呼叫onPause方法,然後呼叫onStop方法,最後呼叫onDestory方法,結束當前Activity

僅僅知道還是不夠的,我們要用例項來融會貫通:

public class MainActivity extends Activity {
    private static final String TAG = "MainActivity";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.i(TAG, "onCreate called.");
        setContentView(R.layout.activity_main);
        Button btn = (Button) findViewById(R.id.btn);
        btn.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View v) {
                Intent intent = new Intent(getApplicationContext(),SecondActivity.class);
                startActivity(intent);
            }
        });
    }
    //Activity建立或者從後臺重新回到前臺時被呼叫
        @Override
        protected void onStart() {
                super.onStart();
                Log.i(TAG, "onStart called.");
            }

                //Activity從後臺重新回到前臺時被呼叫
                @Override
        protected void onRestart() {
                super.onRestart();
                Log.i(TAG, "onRestart called.");
            }

                //Activity建立或者從被覆蓋、後臺重新回到前臺時被呼叫
                @Override
        protected void onResume() {
                super.onResume();
                Log.i(TAG, "onResume called.");
            }

                //Activity被覆蓋到下面或者鎖屏時被呼叫
                @Override
        protected void onPause() {
                super.onPause();
                Log.i(TAG, "onPause called.");
                //有可能在執行完onPause或onStop後,系統資源緊張將Activity殺死,所以有必要在此儲存持久資料
            }

                //退出當前Activity或者跳轉到新Activity時被呼叫
                @Override
       protected void onStop() {
                super.onStop();
                Log.i(TAG, "onStop called.");
            }

                //退出當前Activity時被呼叫,呼叫之後Activity就結束了
                @Override
        protected void onDestroy() {
                super.onDestroy();
                Log.i(TAG, "onDestory called.");
            }

    執行上述程式碼,點選按鈕後可以看見如下TAG

這就是一次完整的常規activity生命週期。

從某種角度看,ActivityAndroid應用提供了視覺化使用者介面,如果該Android應用需要多個使用者介面,那麼這個Android應用將會包含多個Activity,多個Activity組成Activity棧,當前活動的Activity位於棧頂。

提到Activity棧則不得不談談Activity的啟動模式。

一、Activity的啟動模式

Android中的activity一共有四種啟動模式,分別是:standardsingleTopsingleTasksingleInstance。可以在AndroidManifest.xml中設定啟動模式。

1、standard

android:launchMode="standard"
<!-- 設定為預設啟動模式-->

standard活動預設的啟動模式每開始一個activity就會在棧中加一個activity相同的也會加所以加多少個就要按多少次返回鍵才能回到最初的介面

2、singleTop

android:launchMode="singleTop"

    棧頂複用模式,在這種模式下,如果新Activity已經位於任務棧的棧頂,那麼此Activity不會被重新建立,同時它的onNewIntent方法會被回撥,通過此方法的引數我們可以取出當前請求的資訊。需要注意的是,此ActivityonCreateonStart方法不會被系統呼叫,因為它並沒有發生改變。若新Activity的例項已存在但不是位於棧頂,那麼新Activity仍然會重新建立。例如:加上目前棧內的情況為ABCD,其中ABCD為四個ActivityA位於棧底,D位於棧頂,這個時候假設要再次啟動D,如果D的啟動模式為singleTop,那麼棧內的情況仍然為ABCD;如果D的啟動模式為standard,那麼由於D被重新建立,導致棧內的情況就變為ABCD

3、singleTask

android:launchMode="singleTask"

棧內複用模式,一種單例項模式。在任務棧裡面只允許一個例項存在,假如02singletask,棧裡是:01 02 01 03 若此時開啟02,則會複用這個已經存在的activity,並且把當前activity上面其他的activity從任務棧裡清空!

相當於調 onNewIntent+ClearTop

設定了"singleTask"啟動模式的Activity,它在啟動的時候,會先在系統中查詢屬性值affinity等於它的屬性值taskAffinity的任務存在;如果存在這樣的任務,它就會在這個任務中啟動,否則就會在新任務中啟動。因此,如果我們想要設定了"singleTask"啟動模式的Activity在新的任務中啟動,就要為它設定一個獨立的taskAffinity屬性值。

如果設定了"singleTask"啟動模式的Activity不是在新的任務中啟動時,它會在已有的任務中檢視是否已經存在相應的Activity例項,如果存在,就會把位於這個Activity例項上面的Activity全部結束掉,即最終這個Activity例項會位於任務的堆疊頂端中。

4、singleInstance

android:launchMode="singleInstance"

    singleInstance的啟動模式更加極端,開啟新的activity,會給自己建立一個單獨的任務棧,不管是從應用內部開啟還是通過其他應用呼叫TaskId(Android中每一個任務棧都有自己的一個ID,用TaskId表示)是單獨的,已存在的則只需呼叫onNewIntent應用場景:在整個手機作業系統裡面只會有一個該activity的例項存在,有道詞典,金山詞典等。所以多個應用程式共享這個activity的例項,有執行緒安全問題!例如鬧鈴提醒,將鬧鈴提醒與鬧鈴設定分離等。

由於某種原因,先簡單介紹在這,日後再做詳細程式碼演示。

相關推薦

Android基礎()——AndroidActivity簡單介紹

一、Activity的基本介紹 Android應用中通常由一個或者多個基本元件組成,我們平時看到的Andrid應用中最常用的元件就是Activity。Activity、BroadcastReceiver、ContentProvider和Service合稱Android的四大

Android基礎Android快速入門--你必須要知道的基礎

1. Activity的理解: 2. Intent的理解 關於IntentFilter 3. Intent的使用:(建立、攜帶資料、讀取資料) 1.建立:      顯式意圖: Intent intent = new Inten

Android基礎(二)——Android應用結構分析和清單檔案

一、Android應用目錄結構簡單介紹 在Android Studio上開發Android應用簡單方便,除了建立Android專案,開發者只需做兩件事情:1.使用activiy_main.xml檔案定

Android基礎Android Studio側滑欄的實現。

1 . 先建立一個.xml檔案,命名為left_menu代表我們的側滑欄,(這個名字可以自己定義,不要在意。)把全部刪除改成 <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:a

Android基礎(一)——Android的背景以及開發環境的搭建介紹

    本人自接觸Android開發算起,也算有些年頭,走過彎路,也跳進過坑,現在細細想來,其實當初也可以不用這麼狼狽。幾經輾轉反側,痛定思痛,我決定把我從接觸開發以來的所有必備的知識和自己跳過的坑全部寫下來,望有緣人看了後能有所感悟即是我最大的期望。從基礎到進階,我只要

Android基礎——聊聊Activity

我們在上一章裡講述瞭如何使用Android Studio新建一個Android專案來作為我們的Android基礎的入門知識點。相信跟著教程走的童鞋都可以在模擬器或者真機上看到 hello 的字樣,這說明你們已經成功get到了開發Android專案的最基礎的部分,但或許有人在疑問,可是我明

Android基礎之在ListView顯示網路圖片

http://blog.csdn.net/y13872888163/article/details/6434001 最近在做一個天氣預報的例子,想在ListView中新增網路圖片,在翻閱很多文件,在Baidu上Google很久,終於找到了辦法,現在跟大家分享一下解決方

<Android基礎>() Activity Part 2

不可 不可靠 spa 進行 ima 應用程序 屬性 second android 1.活動生命周期 1)返回棧 2)活動狀態 3)活動的生存期 2.活動的啟動模式 1)standard 2)singleTop 3)singleTask 4)singleIns

Android基礎】利用Intent在Activity之間傳遞數據

一次 there center ack and block for success display 前言: 上一篇文章給大家聊了Intent的使用方法。怎樣用Intent啟動Activity和隱式Intent。這一篇文章給大家聊聊怎樣利用Intent在Activit

Android核心服務解析()——Android系統的啟動

onf med cin gets get lld 系統屬性 基本 安裝模塊 從大的方面來說。Android系統的啟動能夠分為兩個部分:第一部分是Linux核心的啟動,第二部分是Android系統的啟動。第一部分主要包含系統引導,核心和驅動程序等,因為它們不屬於本篇要講的

Android基礎——建立一個Android工程

Android系列停了兩個月,電腦還是沒弄好,記憶體不能外拓。現在把windows換成了ubuntu,再裝AS,發現雖然還是卡,但不至於卡到宕機。所以又出來折騰啦。 今天正式開始Android的開發系列,初始階段當然從建立一個Android工程開始: 下面是步驟: 1.開啟As,滑

Android 基礎知識——四大元件之Activity(二)

今天我們來探討一下activity有什麼啟動模式,都有什麼特點呢,且看下面分析 1.Task以及back stack     >Task(任務)  為了完成一個功能  多個Activity的集合,     當你的應用程式啟動時 系統會自動建立Task用於管理Activ

Android 面試題總結之Android 基礎

Android 面試題總結之Android 基礎Broadcast Receiver(三) 在上一章節Android 面試題總結之Android 基礎ContentProvider(二) 我們講的ContentProvider和Intent基礎知識。本節

Android之---ButterKnife-View注入框架(簡單介紹和在Studio安裝)

ButterKnife-View注入框架(簡單介紹和在Studio中安裝) 1.簡單介紹 Butter Knife使用簡單介紹 作為一名Android開發,是不是經常厭煩了大量的findViewById以及setOnClickListener程式碼,而

Android 基礎十五)~ RecyclerView多型別Item的正確實現姿勢

簡介 RecyclerView是我們開發過程中經常使用到的一個元素,原生的RecyclerView.Adapter基本上可以滿足一般的需求,關於RecyclerView的基礎介紹請移步: 關於多型別的Item,原生的Adapter可以通過getItemView

Android基礎控制元件——ProgressBar自定義的介紹、動畫效果實現、附加個漂亮的進度條

ProgressBar自定義的介紹、動畫效果實現、附加三個漂亮的進度條 shape屬性介紹: corners 圓角   gradient 漸變   padding 內容離邊界距離   size 大小   solid 填充顏色   stroke 描邊 gradien

Android基礎知識之四大元件Activity(五)Activity生命週期場景的應用

今天,來寫一個關於Android四大元件Activity生命週期的一個簡單應用,做一個關於極簡單的音樂播放器(只是為了鞏固一下Activity的生命週期,並不能當作專案來用)。 先來截個介面的圖: 很簡單吧,只有三個按鈕,播放一首歌,但來研究Activity的生命週期,這

JSON字串格式化,自動縮排 ---Android基礎

JSON字串格式化 文 | 莫若吻 (注:本文轉載自網路,原作者寫的不錯,學習、支援一下。當然若原作者有異議可以聯絡我將其刪除。謝謝!) 使用後的格式如下圖: 具體程式碼如下: public class JsonUtils { /** * @

android View的個構造方法 簡單總結

在android開發中,我們經常會涉及到自定義View,View有3個構造方法(可能以後會更多),如下: public CircleView(Context context) { this(context,null); }public CircleView(Contex

野人學Android基礎之初探UI控制元件第一課--TextView動態賦值

除了上節課中講到的TextView靜態賦值,還有一種更加靈活的賦值方法–動態賦值。在app的執行過程中,根據程式的需要可以隨時改變TextView的值。 其實現的基本邏輯可以歸納如下: 1.通過id獲取我們要操作的TextView控制元件 2.使用一些方法