1.Standard(標(biāo)準(zhǔn)模式-默認(rèn))
2.SingleTop(棧頂復(fù)用模式)
3.SingleTask(棧內(nèi)復(fù)用模式)
4.SingleInstance(全局唯一模式)
standard 啟動(dòng)模式
這是 Activity 默認(rèn)的啟動(dòng)模式锅移,這種模式下胚泌,每次 startActivity 都會(huì)在棧頂創(chuàng)建一個(gè)新的實(shí)例抖拦,在同一個(gè)任務(wù)中可以存在多個(gè)Activity 的實(shí)例。
singleTop 啟動(dòng)模式
棧頂復(fù)用趁矾,也就是說(shuō),要啟動(dòng) singleTop 模式的 Activity,如果它恰好在當(dāng)前棧頂定硝,那么直接復(fù)用,執(zhí)行其 onNewIntent 方法毫目。否則蔬啡,就重新創(chuàng)建一個(gè)實(shí)例入棧。
singleTask(棧內(nèi)復(fù)用模式)
? ? 棧內(nèi)復(fù)用模式镀虐。這是一種單實(shí)例模式箱蟆,在這種模式下,只要 Activity 在一個(gè)棧中存在刮便,那么多次啟動(dòng)此 Activity 都不會(huì)重新創(chuàng)建實(shí)例空猜,和 singleTop 模式一樣,系統(tǒng)也會(huì)回調(diào)其 onNewIntent诺核。
? ? 注意抄肖,這里我們分 3 種情況來(lái)理解這個(gè) launchMode:
?? ?1. 被啟動(dòng)的 Activity 任務(wù)棧不存在:
? ??? ? 此時(shí)會(huì)新建一個(gè)該 Activity 的任務(wù)棧,并將 Activity 實(shí)例放到任務(wù)棧中窖杀。
?? ?2. 被啟動(dòng)的 Activity 任務(wù)棧存在漓摩,但是任務(wù)棧中該 Activity 實(shí)例不處于棧頂而在棧內(nèi):
? ??? ? 此時(shí)會(huì)先將該 Activity 實(shí)例上面的其它 Activity 實(shí)例全部出棧(因?yàn)樵搯?dòng)模式默認(rèn)具有 clearTop 效果)并將要啟動(dòng)的 Activity 實(shí)例置于棧頂,系統(tǒng)調(diào)用其 onNewIntent 方法入客。
?? ?3. 被啟動(dòng)的 Activity 存在任務(wù)棧管毙,而且該 Activity 實(shí)例在該任務(wù)棧棧頂位置:
? ? ?? ?直接復(fù)用任務(wù)棧中的該 Activity 實(shí)例,并調(diào)用其 onNewIntent 方法桌硫。
? ? 這里我們還需要注意一個(gè) Activity 的屬性 TaskAffinity夭咬,可以翻譯為任務(wù)相關(guān)性。它標(biāo)識(shí)了一個(gè) Activity 所需要的任務(wù)棧的名字铆隘,默認(rèn)情況下卓舵,所有 Activity 所需的任務(wù)棧的名字為應(yīng)用的包名。這個(gè)屬性主要和 singleTask 啟動(dòng)模式或者 allowTaskReparenting 屬性配對(duì)使用膀钠,在其它情況下沒(méi)有意義掏湾,為這個(gè)啟動(dòng)的 Activity 的任務(wù)棧指定相應(yīng)的名稱(chēng)裹虫。
taskAffinity屬性:
那么什么是taskAffinity屬性呢,可以簡(jiǎn)單的理解為任務(wù)相關(guān)性融击。
這個(gè)參數(shù)標(biāo)識(shí)了一個(gè)Activity所需任務(wù)棧的名字筑公,默認(rèn)情況下,所有Activity所需的任務(wù)棧的名字為應(yīng)用的包名
我們可以單獨(dú)指定每一個(gè)Activity的taskAffinity屬性覆蓋默認(rèn)值
一個(gè)任務(wù)的affinity決定于這個(gè)任務(wù)的根activity(root activity也就是這個(gè)任務(wù)的棧低的activity)的taskAffinity
在概念上尊浪,具有相同的affinity的activity(即設(shè)置了相同taskAffinity屬性的activity)屬于同一個(gè)任務(wù)
為一個(gè)activity的taskAffinity設(shè)置一個(gè)空字符串匣屡,表明這個(gè)activity不屬于任何task
? ? ? ?很重要的一點(diǎn)taskAffinity屬性不對(duì)standard和singleTop模式有任何影響,即時(shí)你指定了該屬性為其他不同的值拇涤,這兩種啟動(dòng)模式下不會(huì)創(chuàng)建新的task(如果不指定即默認(rèn)值捣作,即包名)
singleInstance(單實(shí)例模式)
? ? 單實(shí)例模式。這是一種加強(qiáng)的 singleTask 模式工育,它除了具有 singleTask 模式的所有特性外虾宇,還加強(qiáng)了一點(diǎn),那就是具有此種模式的 Activity 只能單獨(dú)地位于一個(gè)任務(wù)棧中如绸。
三個(gè)Flag
Intent 類(lèi)里定義了很多 FLAG,這里我只說(shuō)三種:
FLAG_ACTIVITY_NEW_TASK
僅僅通過(guò)intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);啟動(dòng)的 Activity 即使 task 里已經(jīng)有實(shí)例了旭贬,依然會(huì)在棧頂創(chuàng)建一個(gè)新的實(shí)例怔接。
FLAG_ACTIVITY_SINGLE_TOP
僅僅通過(guò)intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);能夠?qū)崿F(xiàn) singleTop 啟動(dòng)模式的效果,也就是僅在當(dāng)前棧里判斷實(shí)例是否處于棧頂稀轨,在棧頂就復(fù)用扼脐,否則新建一個(gè)實(shí)例。
FLAG_ACTIVITY_CLEAR_TOP
清除目標(biāo) Activity上方所有的 Activity奋刽,如果目標(biāo) Activity 是 standard 的啟動(dòng)模式且啟動(dòng)時(shí) intent 里沒(méi)有設(shè)置FLAG_ACTIVITY_SINGLE_TOP這個(gè)flag瓦侮,那么棧里的目標(biāo) Activity 也會(huì)被 finish 掉,重新創(chuàng)建一個(gè)實(shí)例佣谐。
如果目標(biāo) Activity 是非 standard 的啟動(dòng)模式或者啟動(dòng)時(shí)設(shè)置了FLAG_ACTIVITY_SINGLE_TOP肚吏,就不會(huì)清除目標(biāo) Activity,執(zhí)行其 onNewIntent() 方法狭魂。
Flag 組合設(shè)置:
僅僅通過(guò)intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);這兩行代碼來(lái)啟動(dòng)的 Activity罚攀,如果棧里已有 Activity 的實(shí)例,那么清空此 Activity 及其以上的 activites雌澄,然后新建一個(gè)實(shí)例斋泄。
僅僅通過(guò)intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);能夠達(dá)到跟 singleTask 啟動(dòng)模式的效果,如果棧里已有實(shí)例镐牺,則清空其上的 activies炫掐,然后走 onNewIntent()。