Activity 的4種啟動模式(launchMode),像這種姿勢玖姑,基本上是面試必問的愕秫,在這里把它給徹底搞懂,搞透客峭!搞懷孕豫领,呃,不對舔琅。
官方說法
先給出 Google 的文檔等恐,有興趣的可以先去看看。任務和返回棧 這個是翻譯版备蚓,雖然是官方翻譯的课蔬,但是有些地方看起來還是怪怪的,看不慣的同學可以科學上網(wǎng)去看原版郊尝。
這里有一句話很關(guān)鍵:任務是指在執(zhí)行特定作業(yè)時與用戶交互的一系列 Activity二跋。 這些 Activity 按照各自的打開順序排列在堆棧(即返回棧)中。 這句話講得很模糊流昏,不知道任務和返回棧是一個概念扎即。在我看來,就把 task 理解成一個堆棧况凉,是用來存放 Activity 的就可以了谚鄙。如果 task 中的 Activity 都銷毀了,task 也不存在了刁绒。但是只要 task 中還有一個 Activity 存在闷营,task 就還存在。所以也不能說 task 是要多個 Activity 才能存在知市。
task 是怎么工作的
上面也說了傻盟,task 是以堆棧的方式來管理 Activity 的。當應用啟動的時候嫂丙,會創(chuàng)建一個 task娘赴,然后把主 Activity 放進 task 中。繼續(xù)啟動 BCD跟啤,現(xiàn)在 task 中有4個 Activity: Main筝闹、B媳叨、C腥光、D关顷,他們以各自打開的順序放在 task 中。
現(xiàn)在按返回鍵武福,D 出棧议双,taks 中還有:Main、B捉片、C平痰。再按3次返回棧,所有Activity 都銷毀出棧伍纫,然后 task 也不存在了宗雇,下次啟動的時候會再創(chuàng)建一個新的 task。是不是感覺很熟悉呢莹规,沒錯赔蒲,我們平時就是這么使用 APP 的,炒雞簡單是不是良漱。
來一張偷來的圖片舞虱,是不是看起來更形象了呢
好了,現(xiàn)在知道 task 是什么東西了母市,接下來就輪到4個啟動模式了矾兜,這4個啟動模式都跟 task 有緊密關(guān)系。
4個啟動模式
其實患久,應該先想想椅寺,為什么會有4個啟動模式。那肯定是因為默認的啟動模式不能滿足我們的需求蒋失,比如你想啟動一個 Activity 的時候返帕,想把它放到一個新的 task 中。又或者當 task 中已經(jīng)有這個 Activity 了高镐,你想直接使用這個 Activity 就行了溉旋,而不是在啟動一個新的。這些都可以通過配置 Activity 的啟動模式實現(xiàn)嫉髓。
配置 Activity 的啟動模式有2種方式观腊,一種是在 manifest 的 <activity>
標簽中配置,另外一種是使用 intent 標志算行。并且 使用intent 標志定義優(yōu)先級會比在 manifest 中定義的要高梧油。就是說會覆蓋的意思。
1. standard(默認模式)
默認模式州邢,Activity 在 task 中可以有多個實例儡陨。例如:現(xiàn)在有一個 task 和一個啟動模式是 standard 的 Activity A,那么在task中可以有多個 A 的實例。這個很簡單是不是
2. singleTop
如果當前 task 的頂部已存在 Activity 的一個實例骗村,則系統(tǒng)會通過調(diào)用該實例的 onNewIntent() 方法向其傳送 Intent嫌褪,而不是創(chuàng)建 Activity 的新實例。 記住胚股,這個是要在頂部的時候笼痛,才不會創(chuàng)建新實例,如果不是在頂部琅拌,那么它還是會創(chuàng)建新的 Activity缨伊。
例如:當前 task 中有 A B C 三個 Activity,如果 C 的啟動模式是 singleTop 那么當調(diào)用 startActivity 啟動 C 的時候进宝,不會創(chuàng)建新的 Activity刻坊,而是通過 onNewIntent()方法 把這個 intent 傳遞進去。 taks 中還是 A B C 三個 Activity党晋。 這個也很簡單是不是谭胚。
上圖所示: B 不是在頂部,所以還是會創(chuàng)建新的實例
3. singleTask
這個就厲害了隶校,一個Activity 聲明為 singleTask漏益,那么它在一個 task 中,就只能有一個實例深胳。其實從名字就可以看出來了绰疤,single in task 。并且它還會把在它之上的 Activity 全都踢出棧舞终,讓它自己升上頂部轻庆,霸道總裁既視感啊。例如:task 中有三個 Activity ABC敛劝,A的啟動模式是 singleTask余爆。
然后我們調(diào)用 startActivity(A) 啟動 A,這時系統(tǒng)會調(diào)用 A 的 onNewIntent() 方法向其傳送 Intent夸盟。把 B C 出棧蛾方,A上到棧頂。
4. singleInstance
這個比 singleTask 還要屌一點上陕,它也是在一個 task 中只能有一個實例桩砰,并且 singleInstance 會獨自占用一個 task,不與其他任何 Activity 共享释簿。孤獨終老的趕腳把怯纭!