天天看點

【Android學習】之Activity的啟動模式1、Activity的LaunchMode2、Activity 啟動模式相關設定

版權聲明:本文為部落客原創文章,轉載請注明出處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

繼續閱讀