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