Android-activity的啟動(dòng)模式

Activity的LanchMode

在默認(rèn)情況下,我們多次啟動(dòng)同一個(gè)Activity時(shí),系統(tǒng)會(huì)創(chuàng)建多個(gè)實(shí)例并把他們放入到任務(wù)棧中,每當(dāng)按back鍵返回,處于棧頂?shù)腁ctivity就會(huì)出棧,一直下去,知道棧為空。任務(wù)棧與數(shù)據(jù)結(jié)構(gòu)棧模式一致,都是“后進(jìn)先出”。那么,對(duì)于同一次活動(dòng),如果我們多次啟動(dòng),就多次創(chuàng)建相同的實(shí)例,這樣其實(shí)在某些情況下對(duì)資源的利用是一種浪費(fèi),因此,安卓開(kāi)發(fā)中就有了四種啟動(dòng)模式:standard、singleTop、singleTask、singlnstance

(1)standard

系統(tǒng)的默認(rèn)模式為標(biāo)準(zhǔn)模式,這種模式下,每一次啟動(dòng)activity都會(huì)重新創(chuàng)建一個(gè)實(shí)例,然后放入任務(wù)棧中(即使棧中已經(jīng)存在了這個(gè)實(shí)例。那么這個(gè)acitivity的生命周期符合經(jīng)典情況下的生命周期,如onCreate等。

  • 需要注意的是,每個(gè)實(shí)例可以屬于不同的棧,誰(shuí)啟動(dòng)了Activity,Activity就會(huì)進(jìn)入到對(duì)應(yīng)的棧。
  • 因ApplicationContext沒(méi)有任務(wù)棧,所以無(wú)法采用標(biāo)準(zhǔn)模式啟動(dòng)Activity。但可通過(guò)為待啟動(dòng)的Activity指定標(biāo)記位:FLAG_ACTIVITY_NEW_TASK,那么在啟動(dòng)時(shí)就會(huì)為其創(chuàng)建一個(gè)新的任務(wù)棧(這實(shí)際上是采用了singleTask啟動(dòng)模式)
(2)singleTop

棧頂復(fù)用模,其實(shí)很好理解,就是如果啟動(dòng)的Activity已經(jīng)存在于當(dāng)前任務(wù)棧的棧頂,那么就可以復(fù)用棧頂?shù)倪@個(gè)實(shí)例,而不會(huì)重新創(chuàng)建一個(gè)新的實(shí)例,這樣子對(duì)于資源的利用率就提高了。
需要注意的是,在這種情況下,onCreate、onStart不會(huì)被系統(tǒng)調(diào)用,因?yàn)檫@個(gè)實(shí)例并沒(méi)有改變。并且,如果新啟動(dòng)的活動(dòng)沒(méi)有位于棧頂,仍然會(huì)被重新創(chuàng)建。


棧頂復(fù)用
(3)singleTask

棧內(nèi)復(fù)用模式。同樣很好理解,只要新啟動(dòng)的Activity于任務(wù)棧中已經(jīng)存在,那么系統(tǒng)不會(huì)再重新創(chuàng)建該實(shí)例,而是把存在的棧調(diào)到棧頂并調(diào)用onNewIntent方法。


棧內(nèi)復(fù)用
(4)singleInstance

單實(shí)例模式。它除了具有singleTask模式的所有特性之外,還要求Activity只能位于一個(gè)單獨(dú)地任務(wù)棧中。那么,由于棧內(nèi)復(fù)用的特性,后續(xù)再次啟動(dòng)都不會(huì)創(chuàng)建新的實(shí)例,除非這個(gè)棧被系統(tǒng)回收。

啟動(dòng)模式的指定方法

上面簡(jiǎn)單介紹了活動(dòng)的啟動(dòng)模式,其實(shí)并不難理解,接下來(lái)看一個(gè)啟動(dòng)模式如何指定。

1.通過(guò)AndroidMenifest指定
<activity 
          android:name="activity"
          android:configChanges="screenLayout"
          android:lanchMode="singleTask"
          android:label="@string/app_name" />
2.通過(guò)設(shè)置Intent標(biāo)志位
Intent intent=new Intent(MainActivity.this,secondActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
標(biāo)記位屬性及其含義

FLAG_ACTIVITY_SINGLE_TOP 指定啟動(dòng)模式為棧頂復(fù)用模式(singleTop)
FLAG_ACTIVITY_NEW_TASK 指定啟動(dòng)模式為標(biāo)準(zhǔn)模式(standard)
FLAG_ACTIVITY_CLEAR_TOP 所有位于其上層的Activity都要移除,一般和singleTask啟動(dòng)模式一起使用

從優(yōu)先級(jí)來(lái)看,第二種方式要高于第一種,如果兩種方式同時(shí)存在,將會(huì)以第二種方式為準(zhǔn)。但是,需要注意,第二中方式無(wú)法為其指定單實(shí)例模式;Manifest設(shè)置方式無(wú)法設(shè)定FLAG_ACTIVITY_CLEAR_TOP標(biāo)識(shí)。

總結(jié)

本文簡(jiǎn)要介紹了Activity的幾種啟動(dòng)模式,具體實(shí)現(xiàn)讀者可以按照設(shè)置方法設(shè)置后,結(jié)合AS去理解。

最后編輯于
?著作權(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)容