1.Standard(標(biāo)準(zhǔn)模式-默認(rèn))
2.SingleTop(棧頂復(fù)用模式)
3.SingleTask(棧內(nèi)復(fù)用模式)
4.SingleInstance(全局唯一模式)
standard 啟動模式
這是 Activity 默認(rèn)的啟動模式,這種模式下,每次 startActivity 都會在棧頂創(chuàng)建一個新的實(shí)例,在同一個任務(wù)中可以存在多個Activity 的實(shí)例。
singleTop 啟動模式
棧頂復(fù)用,也就是說,要啟動 singleTop 模式的 Activity,如果它恰好在當(dāng)前棧頂,那么直接復(fù)用,執(zhí)行其 onNewIntent 方法。否則,就重新創(chuàng)建一個實(shí)例入棧。
singleTask(棧內(nèi)復(fù)用模式)
? ? 棧內(nèi)復(fù)用模式。這是一種單實(shí)例模式,在這種模式下,只要 Activity 在一個棧中存在,那么多次啟動此 Activity 都不會重新創(chuàng)建實(shí)例,和 singleTop 模式一樣,系統(tǒng)也會回調(diào)其 onNewIntent。
? ? 注意,這里我們分 3 種情況來理解這個 launchMode:
?? ?1. 被啟動的 Activity 任務(wù)棧不存在:
? ??? ? 此時會新建一個該 Activity 的任務(wù)棧,并將 Activity 實(shí)例放到任務(wù)棧中。
?? ?2. 被啟動的 Activity 任務(wù)棧存在,但是任務(wù)棧中該 Activity 實(shí)例不處于棧頂而在棧內(nèi):
? ??? ? 此時會先將該 Activity 實(shí)例上面的其它 Activity 實(shí)例全部出棧(因?yàn)樵搯幽J侥J(rèn)具有 clearTop 效果)并將要啟動的 Activity 實(shí)例置于棧頂,系統(tǒng)調(diào)用其 onNewIntent 方法。
?? ?3. 被啟動的 Activity 存在任務(wù)棧,而且該 Activity 實(shí)例在該任務(wù)棧棧頂位置:
? ? ?? ?直接復(fù)用任務(wù)棧中的該 Activity 實(shí)例,并調(diào)用其 onNewIntent 方法。
? ? 這里我們還需要注意一個 Activity 的屬性 TaskAffinity,可以翻譯為任務(wù)相關(guān)性。它標(biāo)識了一個 Activity 所需要的任務(wù)棧的名字,默認(rèn)情況下,所有 Activity 所需的任務(wù)棧的名字為應(yīng)用的包名。這個屬性主要和 singleTask 啟動模式或者 allowTaskReparenting 屬性配對使用,在其它情況下沒有意義,為這個啟動的 Activity 的任務(wù)棧指定相應(yīng)的名稱。
taskAffinity屬性:
那么什么是taskAffinity屬性呢,可以簡單的理解為任務(wù)相關(guān)性。
這個參數(shù)標(biāo)識了一個Activity所需任務(wù)棧的名字,默認(rèn)情況下,所有Activity所需的任務(wù)棧的名字為應(yīng)用的包名
我們可以單獨(dú)指定每一個Activity的taskAffinity屬性覆蓋默認(rèn)值
一個任務(wù)的affinity決定于這個任務(wù)的根activity(root activity也就是這個任務(wù)的棧低的activity)的taskAffinity
在概念上,具有相同的affinity的activity(即設(shè)置了相同taskAffinity屬性的activity)屬于同一個任務(wù)
為一個activity的taskAffinity設(shè)置一個空字符串,表明這個activity不屬于任何task
? ? ? ?很重要的一點(diǎn)taskAffinity屬性不對standard和singleTop模式有任何影響,即時你指定了該屬性為其他不同的值,這兩種啟動模式下不會創(chuàng)建新的task(如果不指定即默認(rèn)值,即包名)
singleInstance(單實(shí)例模式)
? ? 單實(shí)例模式。這是一種加強(qiáng)的 singleTask 模式,它除了具有 singleTask 模式的所有特性外,還加強(qiáng)了一點(diǎn),那就是具有此種模式的 Activity 只能單獨(dú)地位于一個任務(wù)棧中。
三個Flag
Intent 類里定義了很多 FLAG,這里我只說三種:
FLAG_ACTIVITY_NEW_TASK
僅僅通過intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);啟動的 Activity 即使 task 里已經(jīng)有實(shí)例了,依然會在棧頂創(chuàng)建一個新的實(shí)例。
FLAG_ACTIVITY_SINGLE_TOP
僅僅通過intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);能夠?qū)崿F(xiàn) singleTop 啟動模式的效果,也就是僅在當(dāng)前棧里判斷實(shí)例是否處于棧頂,在棧頂就復(fù)用,否則新建一個實(shí)例。
FLAG_ACTIVITY_CLEAR_TOP
清除目標(biāo) Activity上方所有的 Activity,如果目標(biāo) Activity 是 standard 的啟動模式且啟動時 intent 里沒有設(shè)置FLAG_ACTIVITY_SINGLE_TOP這個flag,那么棧里的目標(biāo) Activity 也會被 finish 掉,重新創(chuàng)建一個實(shí)例。
如果目標(biāo) Activity 是非 standard 的啟動模式或者啟動時設(shè)置了FLAG_ACTIVITY_SINGLE_TOP,就不會清除目標(biāo) Activity,執(zhí)行其 onNewIntent() 方法。
Flag 組合設(shè)置:
僅僅通過intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);這兩行代碼來啟動的 Activity,如果棧里已有 Activity 的實(shí)例,那么清空此 Activity 及其以上的 activites,然后新建一個實(shí)例。
僅僅通過intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);能夠達(dá)到跟 singleTask 啟動模式的效果,如果棧里已有實(shí)例,則清空其上的 activies,然后走 onNewIntent()。