Activity的四種啟動模式對比

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()。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容