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

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

四大啓動模式深刻剖析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 模式。

相關文章
相關標籤/搜索