Activity有四種啟動模式
- standard
- singleTop
- singleTask
- singleInstance
standard
默認模式,每次啟動創(chuàng)建一個Activity,所屬啟動棧跟啟動它的Activity一樣。
singleTop
如果新的activity已經(jīng)位于棧頂,這個時候新建Activity會復用這個Activity而不是新建Activity。此時onCreate(),onStart()不會調(diào)用,onNewIntent方法會被調(diào)用。
其他情況下,和standard模式相同。
singleTask
啟動Activity時,會去尋找當前是否存在一個和taskAffinity名(默認是包名,可以通過Activity的android:taskAffinity屬性指定)一樣的任務棧。
- 如果不存在,則會創(chuàng)建一個新的Task,并創(chuàng)建新的Activity實例入棧到新創(chuàng)建的Task中去。
如果存在,則得到該任務棧,查找該任務棧中是否存在該Activity的實例:- 如果存在實例,則將它上面的Activity實例都出棧,然后回調(diào)啟動的Activity實例的onNewIntent方法。
- 如果不存在該實例,則新建Activity,并入棧。
利用singleTask的這個特性,我們可以將兩個不同App中的Activity設置為相同的taskAffinity,這樣雖然在不同的應用中,但是Activity會被分配到同一個Task中去。
singleInstance
此模式是在singleTask的基礎上,再增加全局唯一性這個特性。
以singleInstance模式啟動的Activity在整個安卓系統(tǒng)中是單例的,獨占自己的一個任務棧。啟動時如果已經(jīng)存在實例(不管此實例是自己應用啟動的,還是其他應用啟動的),就復用實例,并回調(diào)onNewIntent方法 。
其他常用的影響啟動模式的Flag
如果同時設置了android:launchMode=""屬性和intent的flag屬性,后者的優(yōu)先級更高。
有跟四大啟動模式對應的Flag,但這個對應關系有點復雜,一般情況下用屬性設置就可以。
其他的常用Flag還有:
- Intent.FLAG_ACTIVITY_NEW_TASK
該 Flag 通常用于從 Service 啟動 Activity 的場景,由于在 Service 中并不存在 Activity 棧,所以使用該 Flag 來創(chuàng)建一個新的 Activity 棧。
如果找到一個task的taskAffinity與之相同,就將目標Activity壓入此task中,如果查找無果,則創(chuàng)建一個新的task,并將該task的taskAffinity設置為目標Activity的taskActivity,將目標Activity放置于此task。 - Intent.FLAG_ACTIVITY_NO_HISTORY
使用這種模式啟動 Activity,當該 Activity 啟動其他 Activity 后,該 Activity就消失了,不會保留在棧中。 - Intent.FLAG_ACTIVITY_REORDER_TO_FRONT
如果已經(jīng)啟動了四個Activity:A,B,C,D
在D Activity里設置此Flag啟動一個 Activity B,結果是A,C,D,B。 - FLAG_ACTIVITY_CLEAR_TASK
如果在調(diào)用Context.startActivity時傳遞這個標記,將會導致任何用來放置該activity的已經(jīng)存在的task里面的已經(jīng)存在的activity先清空,然后該activity再在該task中啟動,也就是說,這個新啟動的activity變?yōu)榱诉@個空tas的根activity.所有老的activity都結束掉。該標志必須和FLAG_ACTIVITY_NEW_TASK一起使用。
如果已經(jīng)啟動了四個同一task的Activity:A,B,C,D
以 FLAG_ACTIVITY_NEW_TASK|FLAG_ACTIVITY_CLEAR_TASK 為Flag啟動ActivityB后:
結果是只剩ActivityB,并且是新的ActivityB
注:
startActivityForResult時,F(xiàn)lag的設置無效
參考文章:
android開發(fā)中如何結束所有的activity
基礎總結篇之三:Activity的task相關
徹底弄懂Activity四大啟動模式
Activity 啟動模式分析
應用場景
- 重啟APP
Context.startActivity(intentFor<IndexActivity>().newTask().clearTask())
Runtime.getRuntime().exit(1)