四大啓動模式深刻剖析android
Activity 的啓動模式也是一個難點,緣由是形形色色的啓動模式和標誌位太容易混淆,可是 Activity 做爲四大組件之首,它的確很是重要,爲了知足項目的需求,必須使用 Activity 的啓動模式。ide
1. Activity 的 LaunchModethis
1.1 啓動模式翻譯
之因此 Activity 使用啓動模式,由於 Activity 的建立是在任務棧中的,當咱們啓動同一個 Activity 時,系統就會建立多個 Activity 實例放入任務棧中,當咱們按 back 鍵時,任務棧中的實例就會一一出棧。棧我想並不陌生,具備的特色:先進先出。若是咱們不容許系統重複建立相同的 Activity ,咱們就會用到 Activity 的啓動模式進行設置。Activity 的啓動模式分爲四種 standard、singleTop、singleTask和 singleInstance,以前的那篇文章也有相關介紹,下面就簡單提一下。code
(1)standard 標準模式 :blog
這是系統默認的啓動模式,每次啓動一個 Activity 都會建立一個新的實例,無論這個實例是否存在。若是 A 啓動了 B,B 的活動就會進入到 A 的任務棧中。string
(2)singleTop 棧頂複用模式 :it
在這種啓動模式下,新的 Activity 已經位於棧頂,若是再次啓動該 Activity ,此 Activity不會被從新建立。同時系統的 onNewIntent 方法被回調,經過此方法的參數咱們能夠取出當前的請求信息。固然 Activity 的 onCreate、onStart 和 onResume 方法不會從新被調用。若是該 Activity 沒有位於棧頂,該活動就會從新被建立。io
(3)singleTask 棧內複用模式 :class
這是一種單例模式,在這種模式下,只要棧中存在該實例,該實例不會被從新建立。好比:咱們想要建立一個實例 A,系統就會先判斷任務棧中是否存在和 A 一樣的實例。若是實例存在任務棧中,系統就會把 A 調用到棧頂並調用它的 onNewIntent 方法,同時 A 以上的 Activity 實例都會被移除出棧直到 A 位於棧頂位置;若是實例不存在,系統就會創新建立一個新的實例 A 並將其壓入棧頂。
(3)singleInstance 單實例模式 :
我一般把這種模式的 Activity 稱爲 singleTask 模式的增強版,除了具備 singleTask 模式具備的特色外,以 singleInstance 啓動的 Activity 實例單獨存在一個任務棧中,後續的請求不會建立新的實例。
1.2 任務棧
什麼是任務棧?各個 Activity 是怎麼樣分配到各個任務棧的?如下狀況都是在 singleTask模式狀況下來講的。
定義:
從一個參數提及,TaskAffinity ,翻譯爲任務的相關性,這個參數標識了一個 Activity 所須要得任務棧的名字,默認狀況下,Activity 所須要的任務棧的名字爲應用的包名。任務棧分爲前臺任務棧和後臺任務棧,後臺任務棧中的 Activity 處於暫停狀態,用戶能夠將後臺任務棧切換到前臺。 ——任務棧
1.3 設置啓動模式的兩種方式
第一種方式 : 經過 AndroidMenifest 配置文件設置啓動模式。
1<activity 2 android:name=".MonitoringActivitys.MonitorActivity" 3 android:label="@string/title_activity_monitor" 4 android:theme="@style/AppTheme.NoActionBar" 5 android:launchMode="singleTask"> 6 <intent-filter> 7 <action android:name="android.intent.action.MAIN" /> 8 <category android:name="android.intent.category.LAUNCHER" /> 9 </intent-filter> 10 </activity>
第二種方式 : 經過 Intent 中設置標誌位來設置啓動模式。
1Intent intent = new Intent(FirstActivity.this, SecondActivity.class); 2intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 3startActivity(intent);
區別:
① 第二種優先級要高於第一種
② 第一種沒法給 Activity 設定 FLAG_ACTIVITY_CLEAR_TOP 標識,第二種沒法爲 Activity 指定 singleInstance 模式。