1. LaunchMode 簡介
launchMode 是 Activity 類的一個屬性,該屬性包括4個具體值:standard境钟、singleTop粟按、singleTask、singleInstance鸯匹。我們都知道,android 系統(tǒng)中啟動 Activity 是通過 Intent 實例進行的泄伪,當系統(tǒng)收到一個 Intent 的實例需要去啟動指定的 Activity 的時候殴蓬,android 系統(tǒng)會根據(jù)目標 Activity 設(shè)置的該屬性值來決定是需要創(chuàng)建新的該 Activity 實例以及如何在 Task 中創(chuàng)建該 Activity 的實例。這就是 launchMode 這個屬性的作用蟋滴。
2. 四種啟動模式描述
2.1 模式分類
- 普通類型:用戶常用的啟動模式類型染厅,大部分 Activity 都是這兩種啟動模式痘绎。包括 standard 和 singleTop 兩種啟動模式;
- 特殊類型:具有特殊的行為的啟動模式肖粮,只針對特殊需求的使用简逮。包括 singleTask 和 singleInstance 兩種啟動模式。
2.2 standard
可以有 Activity 多個實例尿赚,系統(tǒng)默認的啟動模式,當系統(tǒng)接收到一個 Intent 實例去啟動一個 standard 模式的 Activity 時蕉堰,系統(tǒng)總是會在目標棧的頂部創(chuàng)建一個新的 activity 實例凌净,并把 Intent 的實例傳進去。
也就是說它可以無限制的創(chuàng)建屋讶。你每一次通過 Intent 去啟動這種模式的 Activity 都會重新創(chuàng)建一個冰寻。
2.2.1 該模式在 android5.0 前后的區(qū)別
android 版本 | 目標 Activity 來源 | 目標 Activity 所處棧 |
---|---|---|
5.0之前 | 相同的應(yīng)用 | 當前應(yīng)用棧頂部 |
- | 不同的應(yīng)用 | 當前任務(wù)棧頂部 |
5.0之后 | 相同的應(yīng)用 | 當前應(yīng)用棧頂部 |
- | 不同的應(yīng)用 | 新創(chuàng)建任務(wù)棧的根部 |
2.3 singleTop
“在頂部只能有一個”。
該模式下的 Activity 實例數(shù)要具體情況而定皿渗。當系統(tǒng)接收到一個 Intent 實例去啟動一個 singleTop 模式的 Activity 時斩芭,如果在目標棧的頂部存在一個該 Activity 的實例的話,那么系統(tǒng)就會重用這個 Activity 的實例而不創(chuàng)建新的實例乐疆,并回調(diào)該 Activity 的 onNewIntent(Intent intent)
方法把新的 Intent 實例當作方法參數(shù)傳遞進去划乖;如果在目標棧的頂部沒有該 Activity 的實例的話系統(tǒng)將會再新建一個 Activity 實例,與 standard 的行為就一樣了挤土。
所以需要注意的是琴庵,在開發(fā)時,如果指定了一個 Activity 的啟動模式是 singleTop 的那就應(yīng)該既要重寫 onCreated()
方法用于應(yīng)對第一次創(chuàng)建的情況仰美,也要重寫 onNewIntent()
方法來應(yīng)對重復(fù)創(chuàng)建的情況迷殿。
2.4 singleTask
該模式只允許存在 Activity 一個實例,當系統(tǒng)接收到一個 Intent 實例去啟動一個 singleTask 模式的 Activity 時咖杂,如果不存在該 Activity 的實例的話庆寺,系統(tǒng)會先創(chuàng)建一個新的 Task,并在該 Task 底部里面創(chuàng)建一個該 Activity 的實例诉字,隨后把 Intent 實例傳遞進去懦尝;如果已經(jīng)存在一個該 Activity 的實例的話,系統(tǒng)就不會再創(chuàng)建新的實例奏窑,那么系統(tǒng)就會重用這個 Activity 的實例而不創(chuàng)建新的實例导披,并回調(diào)該 Activity 的 onNewIntent(Intent intent)
方法把新的 Intent 實例當作方法參數(shù)傳遞進去,同時埃唯,該 Activity 實例所在的 Task 將會被調(diào)到前臺撩匕。
2.4.1目標Activity和源Activity是否來自同一應(yīng)用的區(qū)別
源Activity和目標Activity來源 | 是否已經(jīng)存在目標Activity的實例 | 內(nèi)容 |
---|---|---|
來自同一應(yīng)用 | 否 | 直接在當前的任務(wù)棧中創(chuàng)建SingleTask模式的Activity并置于棧頂 |
- | 是 | 系統(tǒng)會把任務(wù)棧中目標Activity之上的所有Activity銷毀,以讓目標Activity處在棧頂?shù)奈恢?/td> |
來自不同應(yīng)用 | 否 | 直接在目標Activity所在應(yīng)用的任務(wù)棧的棧頂創(chuàng)建 |
- | 是 | 目標Activity所在任務(wù)棧會被置于前臺(即用戶可見)墨叛,而且也會把目標Activity之上的所有Actvity全部銷毀止毕。 |
2.5 singleInstance
該模式的 Activity 實例數(shù)唯一模蜡,類似于 singleTask,唯一不同的地方在于扁凛,singleInstance 的 Activity 不允許自己的 Task 中存在其他的 Activity 實例忍疾,也就是說 singleInstance 的 Activity 永遠是 Task 中唯一的一個 Activity 實例。
3. 使用場景
standard:絕大多數(shù)標準的跳轉(zhuǎn)谨朝;
singleTop:需要重復(fù)進入當前頁面卤妒,不用重復(fù)初始化;
singleTask:只允許擁有一個實例字币。