Activity啟動(dòng)模式分析詳解

Activity 的4種啟動(dòng)模式(launchMode),像這種姿勢(shì),基本上是面試必問的,在這里把它給徹底搞懂,搞透!搞懷孕,呃,不對(duì)。

官方說法

先給出 Google 的文檔,有興趣的可以先去看看。任務(wù)和返回棧 這個(gè)是翻譯版,雖然是官方翻譯的,但是有些地方看起來還是怪怪的,看不慣的同學(xué)可以科學(xué)上網(wǎng)去看原版。

這里有一句話很關(guān)鍵:任務(wù)是指在執(zhí)行特定作業(yè)時(shí)與用戶交互的一系列 Activity。 這些 Activity 按照各自的打開順序排列在堆棧(即返回棧)中。 這句話講得很模糊,不知道任務(wù)和返回棧是一個(gè)概念。在我看來,就把 task 理解成一個(gè)堆棧,是用來存放 Activity 的就可以了。如果 task 中的 Activity 都銷毀了,task 也不存在了。但是只要 task 中還有一個(gè) Activity 存在,task 就還存在。所以也不能說 task 是要多個(gè) Activity 才能存在。

task 是怎么工作的

上面也說了,task 是以堆棧的方式來管理 Activity 的。當(dāng)應(yīng)用啟動(dòng)的時(shí)候,會(huì)創(chuàng)建一個(gè) task,然后把主 Activity 放進(jìn) task 中。繼續(xù)啟動(dòng) BCD,現(xiàn)在 task 中有4個(gè) Activity: Main、B、C、D,他們以各自打開的順序放在 task 中。

現(xiàn)在按返回鍵,D 出棧,taks 中還有:Main、B、C。再按3次返回棧,所有Activity 都銷毀出棧,然后 task 也不存在了,下次啟動(dòng)的時(shí)候會(huì)再創(chuàng)建一個(gè)新的 task。是不是感覺很熟悉呢,沒錯(cuò),我們平時(shí)就是這么使用 APP 的,炒雞簡單是不是。

來一張偷來的圖片,是不是看起來更形象了呢

task

好了,現(xiàn)在知道 task 是什么東西了,接下來就輪到4個(gè)啟動(dòng)模式了,這4個(gè)啟動(dòng)模式都跟 task 有緊密關(guān)系。

4個(gè)啟動(dòng)模式

其實(shí),應(yīng)該先想想,為什么會(huì)有4個(gè)啟動(dòng)模式。那肯定是因?yàn)槟J(rèn)的啟動(dòng)模式不能滿足我們的需求,比如你想啟動(dòng)一個(gè) Activity 的時(shí)候,想把它放到一個(gè)新的 task 中。又或者當(dāng) task 中已經(jīng)有這個(gè) Activity 了,你想直接使用這個(gè) Activity 就行了,而不是在啟動(dòng)一個(gè)新的。這些都可以通過配置 Activity 的啟動(dòng)模式實(shí)現(xiàn)。

配置 Activity 的啟動(dòng)模式有2種方式,一種是在 manifest 的 <activity> 標(biāo)簽中配置,另外一種是使用 intent 標(biāo)志。并且 使用intent 標(biāo)志定義優(yōu)先級(jí)會(huì)比在 manifest 中定義的要高。就是說會(huì)覆蓋的意思。

1. standard(默認(rèn)模式)

默認(rèn)模式,Activity 在 task 中可以有多個(gè)實(shí)例。例如:現(xiàn)在有一個(gè) task 和一個(gè)啟動(dòng)模式是 standard 的 Activity A,那么在task中可以有多個(gè) A 的實(shí)例。這個(gè)很簡單是不是

standard

2. singleTop

如果當(dāng)前 task 的頂部已存在 Activity 的一個(gè)實(shí)例,則系統(tǒng)會(huì)通過調(diào)用該實(shí)例的 onNewIntent() 方法向其傳送 Intent,而不是創(chuàng)建 Activity 的新實(shí)例。 記住,這個(gè)是要在頂部的時(shí)候,才不會(huì)創(chuàng)建新實(shí)例,如果不是在頂部,那么它還是會(huì)創(chuàng)建新的 Activity。

例如:當(dāng)前 task 中有 A B C 三個(gè) Activity,如果 C 的啟動(dòng)模式是 singleTop 那么當(dāng)調(diào)用 startActivity 啟動(dòng) C 的時(shí)候,不會(huì)創(chuàng)建新的 Activity,而是通過 onNewIntent()方法 把這個(gè) intent 傳遞進(jìn)去。 taks 中還是 A B C 三個(gè) Activity。 這個(gè)也很簡單是不是。

singleTop

上圖所示: B 不是在頂部,所以還是會(huì)創(chuàng)建新的實(shí)例

3. singleTask

這個(gè)就厲害了,一個(gè)Activity 聲明為 singleTask,那么它在一個(gè) task 中,就只能有一個(gè)實(shí)例。其實(shí)從名字就可以看出來了,single in task 。并且它還會(huì)把在它之上的 Activity 全都踢出棧,讓它自己升上頂部,霸道總裁既視感啊。例如:task 中有三個(gè) Activity ABC,A的啟動(dòng)模式是 singleTask。

singleTask

然后我們調(diào)用 startActivity(A) 啟動(dòng) A,這時(shí)系統(tǒng)會(huì)調(diào)用 A 的 onNewIntent() 方法向其傳送 Intent。把 B C 出棧,A上到棧頂。

singleTask

4. singleInstance

這個(gè)比 singleTask 還要屌一點(diǎn),它也是在一個(gè) task 中只能有一個(gè)實(shí)例,并且 singleInstance 會(huì)獨(dú)自占用一個(gè) task,不與其他任何 Activity 共享。孤獨(dú)終老的趕腳啊!

最后編輯于
?著作權(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),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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