Activity的啟動(dòng)模式

Activity的啟動(dòng)模式

Activity的LaunchMode

standard標(biāo)準(zhǔn)模式
系統(tǒng)的默認(rèn)模式,每次啟動(dòng)都會(huì)重新創(chuàng)建一個(gè)新的實(shí)例。
standard模式的Activity默認(rèn)會(huì)進(jìn)入啟動(dòng)它的Activity所屬的任務(wù)棧中,在使用ApplicationContext去啟動(dòng)standard模式的Activity的時(shí)候會(huì)運(yùn)行時(shí)異常。解決這個(gè)問(wèn)題的方法是為待啟動(dòng)的Activity指定FLAG_ACTIVITY_NEW_TASK標(biāo)記位,這樣啟動(dòng)的時(shí)候就會(huì)為它創(chuàng)建一個(gè)新的任務(wù)棧,這個(gè)時(shí)候待啟動(dòng)Activity實(shí)際上是以singleTask模式啟動(dòng)的。

singleTop棧頂復(fù)用模式
如果新Activity已經(jīng)位于任務(wù)棧的棧頂,那么此Activity不會(huì)被重新創(chuàng)建,同時(shí)它的onNewIntent方法會(huì)被回調(diào),通過(guò)此方法的參數(shù)我們可以取出當(dāng)前請(qǐng)求的信息。這個(gè)Activity的onCreate、onStart不會(huì)被系統(tǒng)調(diào)用,因?yàn)樗麄儧](méi)有發(fā)生改變。如果新Activity的實(shí)例已經(jīng)存在但是不在棧頂,那么新Activity仍然會(huì)重新創(chuàng)建。

singleTask棧內(nèi)復(fù)用模式
只要Activity在一個(gè)棧中存在,那么多次啟動(dòng)此Activity都不會(huì)重新創(chuàng)建實(shí)例,系統(tǒng)會(huì)回調(diào)onNewIntent方法。當(dāng)一個(gè)具有singleTask模式的Activity請(qǐng)求啟動(dòng)后,系統(tǒng)會(huì)首先尋找此Activity所需要的任務(wù)棧,如果需要的任務(wù)棧不存在,就重新創(chuàng)建一個(gè)任務(wù)棧,然后創(chuàng)建Activity的實(shí)例后把Activity放入棧中;如果存在Activity所需要的任務(wù)棧,并且Activity的實(shí)例存在,則把Activity調(diào)到棧頂并調(diào)用onNewIntent方法,如果實(shí)例不存在,就創(chuàng)建Activity的實(shí)例并把Activity放入棧中。

  • 例如目前任務(wù)棧S1中的情況為ADBC,這個(gè)時(shí)候Activity D以singleTask模式請(qǐng)求啟動(dòng),所需的任務(wù)棧為S1,根據(jù)站內(nèi)復(fù)用原則,D不會(huì)被重新創(chuàng)建,系統(tǒng)會(huì)把D切換到棧頂,并調(diào)用其onNewIntent方法,同時(shí)由于singleTask默認(rèn)具有clearTop效果,會(huì)導(dǎo)致棧內(nèi)所有在D上面的Activity全部出棧,因此,S1中的情況為AD。

singleInstance單實(shí)例模式
為加強(qiáng)的singleTask模式,此種模式只能單獨(dú)的位于一個(gè)任務(wù)棧中

  • Activity A是singleInstance模式,當(dāng)A啟動(dòng)后,系統(tǒng)會(huì)為它創(chuàng)建一個(gè)新的任務(wù)棧,然后A就在這個(gè)新的任務(wù)棧中,由于棧內(nèi)復(fù)用的特性,后續(xù)的請(qǐng)求均不會(huì)創(chuàng)建新的Activity,除非這個(gè)獨(dú)特的任務(wù)棧被系統(tǒng)銷(xiāo)毀。

給Activity指定啟動(dòng)模式

  1. 通過(guò)AndroidMenifest設(shè)置

    android:launchMode="singleTask"
    
  1. 通過(guò)Intent中設(shè)置標(biāo)志位

    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    
    • FLAG_ACTIVITY_NEW_TASK
      為Activity指定“singleTask”啟動(dòng)模式
    • FLAG_ACTIVITY_SINGLE_TOP
      為Activity指定“singleTop”啟動(dòng)模式
    • FLAG_ACTIVITY_CLEAR_TOP
      使用此標(biāo)記的Activity,當(dāng)它啟動(dòng)時(shí),在同一個(gè)任務(wù)棧中所有位于它上面的Activity都要出棧。此模式一般和FLAG_ACTIVITY_NEW_TASK 配合使用。
    • FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
      使用此標(biāo)記的Activity不會(huì)出現(xiàn)在歷史Activity的列表里,相當(dāng)于
    android:excludeFromRecents="true"
    
最后編輯于
?著作權(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)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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