理解Android的四種啟動模式
- 2021 年 12 月 29 日
- 筆記
- Android基礎, android底層一點, intent
一:前言
四種模式分別為standard, singleTop, singleTask, singleInstance。自己應該明確一個概念先,single到底要single什麼。每一個應用app都有一個包名,然後每一個應用都會有一個task,這個task和包名對應起來,如果要創建一個新task,名字就得不一樣。
- 一個應用會有一個包名,應用中默認有一個以包名為名字的task
- task是一個概念,實現是stack棧。
- task用來管理activity,一個activity轉到另一個activity,就會把新activity壓棧,遵循先進後出。
- task中的activity可以跨應用,比如說app中跳轉到微信,然後按返回鍵又可以回到自己那個應用。
二:如何改變啟動模式
- 在manifest中對activity設置
- 更改Intent啟動activity時的flag
三:直接從singleTop開始
三個activity,activity1可以跳轉到activity2,activity2可以跳轉到activity3.
1:第一種情況,棧頂已有實例
棧底---------------------------------------》棧頂 acitivity1 activity2 acitivity3 這時候以singleTop模式啟動activity3,重用舊實例, 備註:順便調用activity3的onNewIntent()方法 棧底---------------------------------------》棧頂 acitivity1 activity2 acitivity3
2:第二種情況,棧頂沒有實例
棧底---------------------------------------》棧頂 acitivity1 acitivity3 activity2 這時候以singleTop模式啟動activity3,創建新實例 棧底---------------------------------------》棧頂 acitivity1 acitivity3 activity2 activity3(new)
四:很簡單的singleTask
注意要在manifest中設置
android:launchMode="singleTask"
(我發現設不設置intent的flag都沒用,關鍵是設置這個,只設置flag沒有用)
1:第一種情況,在manifest中沒有設置了taskAffinity
當前task沒有這個activity的實例就創建一個,放在棧頂;若是有實例,就把那個實例上面的activity全部出棧(銷毀),並調用要啟動的activity實例的:onRestart, onStart, onResume
棧底---------------------------------------》棧頂 acitivity1 acitivity3 activity2 這時候以singleTast模式啟動activity3,但沒有taskAffinit 會把已有的activity3上面的activity,即activity2出棧,銷毀 並調用已有的activity3的onRestart,onStart, onResume 棧底---------------------------------------》棧頂 acitivity1 acitivity3 (old)
即singleTask確保在當前task實例唯一
2:第二種情況,在manifest中設置了taskAffinity
2.1:這個task已被創建
棧底---------------------------------------》棧頂
task1:
acitivity1 acitivity3 activity2
task2:
acitivity1 acitivity3 activity2
以singleTask模式啟動activity3,指定task2,表現和第一種情況一樣
把上面的activity都出棧
task1:
acitivity1 acitivity3 activity2
task2:
acitivity1 acitivity3(old)
2.2:這個task未被創建
棧底---------------------------------------》棧頂 task1: acitivity1 acitivity3 activity2 以singleTask模式啟動activity3,指定task2 會創建task2,並創建新實例放進去 task1: acitivity1 acitivity3 activity2 task2: activity3(new)
ps:之後activity3啟動的其他activity,除非新指定task,否則都在activity3所在的棧中了,即所謂嫁雞隨雞嫁狗隨狗
singleTask名字誤導很大,我覺得名字為singleAtTask更貼切。
五:更簡單的singleInstance
啟動模式為singleInstance的activity,在整個手機中,只能有一個實例,再次調用的時候,會找到這個實例並把它調到前台。
比如說activity1已singleInstance模式啟動,那就把它調到前台(已存在的話)。
- activity1屬於一個唯一的task,這個task只有它一個
- activity1啟動其他activity,若這個activity指明taskAffinit(即使不是singleTask模式),就在指明的task中創建,若沒有指明taskAffinit,就默認找應用包名的task。這邊邏輯和singleTask很像了。
參考資料://blog.csdn.net/zhangjg_blog/article/details/10923643
//www.kancloud.cn/alex_wsc/android_art/1828110