Activity四種啟動(dòng)模式及相關(guān)Flag

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還有:

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

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

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