Activity 的 LaunchMode
Android 目前有四中啟動模式:standard、singleTop、singleTask、singleInstance。
- standard:標(biāo)準(zhǔn)模式,也是系統(tǒng)默認(rèn)模式。每次啟動一個 Activity 都會重新創(chuàng)建一個新的實(shí)例,被創(chuàng)建的實(shí)例的生命周期符合典型的情況下的 Activity 的生命周期。這種模式下,誰啟動了這個 Activity,那么這個 Activity,那么這個 Activity 就運(yùn)行在啟動它的那個 Activity 所在的任務(wù)棧中。如果用 ApplicationContext 去啟動 standard 模式的 Activity 會報錯,因?yàn)榉?Activity 類型的 context 并沒有任務(wù)棧。 這種情況在安卓高版本,如 7.0,8.0 是不會出錯的,在安卓 4.4 是會報錯的,懷疑安卓修改了非 Activity 啟動 Activity 的機(jī)制。
- singleTop:棧頂復(fù)用模式。如果新的 Activity 已經(jīng)位于任務(wù)棧的棧頂,那么此 Activity 不會被重新創(chuàng)建,同時它的 onNewIntent 方法會被調(diào)用,通過此方法的參數(shù)我們可以取出當(dāng)前請求的信息。這個 Activity 的 onCreate、onStart 不會被系統(tǒng)調(diào)用,因?yàn)樗鼪]有發(fā)生改變,如果新Activity的實(shí)例已存在,但不是位于棧頂,那么新 Activity 仍然會重新創(chuàng)建。
啟動棧頂 Activity 的生命周期如下。
onPause
onNewIntent
onResume
- singleTask:棧內(nèi)復(fù)用模式。只要 Activity 在一個棧中存在,那么多次啟動此 Activity 都不會重新創(chuàng)建實(shí)例,系統(tǒng)也會回調(diào)其 onNewIntent。當(dāng)一個具有 singleTask 模式的 Activity 請求啟動后,系統(tǒng)首先會尋找是否存在 A 想要的任務(wù)棧,如果不存在就創(chuàng)建一個任務(wù)棧,并將新創(chuàng)建的實(shí)例放入棧中。如果存在其所需要的任務(wù)棧,這個棧中要是有該實(shí)例存在,就會把其調(diào)到棧頂并調(diào)用它的 onNewIntent 方法,如果不存在,就創(chuàng)建該實(shí)例并將其壓入棧中。
- singleInstance:單實(shí)例模式,加強(qiáng)版的 singleTask,擁有 singleTask 模式的所有特征,除此之外,具有這種模式的 Activity 只能獨(dú)立的位于一個任務(wù)棧中,后續(xù)的請求都會創(chuàng)建新的 Activity,除非這個獨(dú)特的任務(wù)棧被系統(tǒng)銷毀。
TaskAffinity 這個參數(shù)標(biāo)識了一個 Activity 所需要的任務(wù)棧的名字,默認(rèn)情況下,所有 Activity 所需要的任務(wù)棧的名字為應(yīng)用的包名。
<activity android:name=".SecondActivity"
android:taskAffinity="com.example.testandroid.task1"
android:launchMode="singleTask"/>
指定啟動模式
方法一:通過 AndroidMenifest 為 Activity 指定啟動模式。
<activity .
android:name=".LifecycleActivity"
android:launchMode="singleTask"/>
方法二:通過在 Intent 中設(shè)置標(biāo)志位來位 Activity 指定啟動模式。
Intent intent = new Intent(MyApplication.this, LifecycleActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
這兩種方法都能為 Activity 指定啟動模式,優(yōu)先級上第二種方法要高于第一種,如果兩個同時存在,以第二種方式為準(zhǔn);其次,第一種方法無法直接為 Activity 設(shè)定 FLAG_ACTIVITY_CLEAR_TOP 標(biāo)識,而第二種方式無法為 Activity 指定 singleInstance 模式。
Activity 的 Flags
設(shè)定 Activity 的啟動模式
| 字段 | 作用 |
|---|---|
| FLAG_ACTIVITY_NEW_TASK | 為 Activity 指定 singleTask |
| FLAG_ACTIVITY_SINGLE_TOP | 為 Activity 指定 singleTop |
影響 Activity 的運(yùn)行狀態(tài)
| 字段 | 作用 |
|---|---|
| FLAG_ACTIVITY_CLEAR_TOP | 具有此標(biāo)記的 Activity,當(dāng)它啟動時,在同一個任務(wù)棧上它上面的 Activity 都要出棧。singleTask 啟動模式默認(rèn)具有此標(biāo)記位的效果 |
| FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS | 具有這個標(biāo)記的 Activity 不會出現(xiàn)在 歷史 Activity 的列表中,當(dāng)某些情況下不希望用戶通過歷史列表回到我們的 Activity 的時候有用,等同于在 XML 中指定 Activity 的屬性 android:excludeFromRecents="true" |