Android 高級進階之深入剖析四大啓動模式

Android 高級進階之深入剖析四大啓動模式

四大啓動模式深入剖析

Activity 的啓動模式也是一個難點,原因是形形色色的啓動模式和標誌位太容易混淆,但是 Activity 作爲四大組件之首,它的確非常重要,爲了滿足項目的需求,必須使用 Activity 的啓動模式。

1. Activity 的 LaunchMode

1.1 啓動模式

之所以 Activity 使用啓動模式,因爲 Activity 的創建是在任務棧中的,當我們啓動同一個 Activity 時,系統就會創建多個 Activity 實例放入任務棧中,當我們按 back 鍵時,任務棧中的實例就會一一出棧。棧我想並不陌生,具有的特點:先進先出。如果我們不允許系統重複創建相同的 Activity ,我們就會用到 Activity 的啓動模式進行設置。Activity 的啓動模式分爲四種 standard、singleTop、singleTask和 singleInstance,之前的那篇文章也有相關介紹,下面就簡單提一下。

(1)standard 標準模式 :

這是系統默認的啓動模式,每次啓動一個 Activity 都會創建一個新的實例,不管這個實例是否存在。如果 A 啓動了 B,B 的活動就會進入到 A 的任務棧中。

(2)singleTop 棧頂複用模式 :

在這種啓動模式下,新的 Activity 已經位於棧頂,如果再次啓動該 Activity ,此 Activity不會被重新創建。同時系統的 onNewIntent 方法被回調,通過此方法的參數我們可以取出當前的請求信息。當然 Activity 的 onCreate、onStart 和 onResume 方法不會重新被調用。如果該 Activity 沒有位於棧頂,該活動就會重新被創建。

(3)singleTask 棧內複用模式 :

這是一種單例模式,在這種模式下,只要棧中存在該實例,該實例不會被重新創建。比如:我們想要創建一個實例 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 模式。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章