版權聲明:本文為部落客原創文章,轉載請注明出處http://blog.csdn.net/u013132758。 https://blog.csdn.net/u013132758/article/details/50821710
前面的部落格中介紹了Activity的生命周期。除了Activity的生命周期外,Activity的啟動模式也是一個我們學習Android的難點。
1、Activity的LaunchMode
首先我們來介紹一下什麼是Activity的啟動模式,以及為什麼需要Activity的啟動模式。下面我們用一個例子來說明:
當我們在預設情況下建立一個Activity的時候,在多次調用該Activity的時候,系統會建立多個該Activity的執行個體,并把他們放入任務棧中,當我們按back鍵的時候,會發現這些Activity會以“後進先出”的方式回退,直到棧空時,系統會回收任務棧。
在這之中我們會發現Activity這樣重複建立是不是很麻煩,這就出現了Activity的啟動模式,目前Activity的啟動模式有四種:standard,singleTop,singleTask,singleinstance。
1.1、standard(标準)模式
所謂标準模式就是我們最常用的系統預設模式,每次啟動一個Activity不管這個Activity的執行個體是否存在,都會重新建立一個新的Activity執行個體,這種模式的Activity符合典型情況下的生命周期:它的OnCreat(),OnStart(),onResume()都會被調用。
1.2、singleTop(棧頂複用)模式
棧頂複用顧名思義就是在棧頂重複使用,在這種模式下,如果需要啟動的Activity已經在任務棧的棧頂,那麼任務棧不會被重新建立,同時會調用它的onNewIntent方法,通過此方法的參數我們可以取出目前請求的資訊,這種情況下不會調用OnCreat(),OnStart()。
例:目前棧内由棧底到棧頂有ABC三個Activity,假設再次啟動C,若C的啟動模式為singleTop那麼就不會建立C,棧内仍然為ABC。若啟動模式為standard,C會被再一次建立,那麼棧内情況就是ABCC。
1.3、singleTask(棧内複用模式)
這是一種單例模式,在這種模式下隻要Activity在棧中存在,那麼多次啟動該Activity都不會建立執行個體,和singleTop一樣,系統也會回調其onNewintent。
這種模式下系統首先會尋找A所需要的任務棧,如果任務棧不存在則之間建立任務棧并建立A加入到棧中。如果A所需要的任務棧存在,則再尋找是否存在A的執行個體,如果存在則将A調到棧頂。如果不存在那麼系統會建立A的執行個體,并壓入棧中。
例1:目前棧S1内情況如下:系統要啟動Activity的執行個體 C在棧S2中。則系統首先會建立棧S2,然後再建立Activity的執行個體C并壓入棧中。
圖1 圖2 圖3 圖4 圖5
例2:目前棧S1内情況如圖2:系統要啟動Activity的執行個體 C在棧S1中。則系統首先會找到棧S1,然後再在棧中尋找Activity的執行個體C,C不存在則建立C的執行個體并壓入棧中(圖3)。
例3:目前棧S1内情況如圖4:系統要啟動Activity的執行個體 C在棧S1中。則系統首先會找到棧S1,然後再在棧中尋找Activity的執行個體C,C在棧S1中,則調用C的執行個體到棧頂(圖5)。
1.4、singleInstance(單例模式)
在這種模式下的Activity隻能單獨的運作在一個任務棧中。而且具有所有SingleTask模式的特性。也就是系統要啟動A則會首先建立一個任務棧然後将A壓入棧。
2、Activity 啟動模式相關設定
我在前面多次提到Activity的任務棧,用TaskAffinity這個參數來設定,這個參數用于表示一個Activity所需任務棧的名字,預設情況下所有Activity所需任務棧的名字為其包名。
給Activity指定啟動模式有以下兩種方法:
1、在AndroidMenifest.xml中設定
<span style="font-family:KaiTi_GB2312;font-size:18px;"><activity
android:name="com.bthvi.new.MyActivity"
android:configChanges="screenLayout"
android:launchMode="singleTask"
android:lable="@string/app_name"/></span>
2、通過Intent中設定标志位
<span style="font-family:KaiTi_GB2312;font-size:18px;">Intent intent = new Intent(MainActivity.this,MyActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);</span>
其中标志Flags有:
FLAG_ACTIVITY_NEW_TASK、
FLAG_ACTIVITY_SINGLE_OP
FLAG_ACTIVITY_CLEAR_TOP
FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS