1.Standard(標準模式-默認)
2.SingleTop(棧頂復用模式)
3.SingleTask(棧內復用模式)
4.SingleInstance(全局唯一模式)
standard 啟動模式
這是 Activity 默認的啟動模式,這種模式下,每次 startActivity 都會在棧頂創建一個新的實例,在同一個任務中可以存在多個Activity 的實例。
singleTop 啟動模式
棧頂復用,也就是說,要啟動 singleTop 模式的 Activity,如果它恰好在當前棧頂,那么直接復用,執行其 onNewIntent 方法。否則,就重新創建一個實例入棧。
singleTask(棧內復用模式)
? ? 棧內復用模式。這是一種單實例模式,在這種模式下,只要 Activity 在一個棧中存在,那么多次啟動此 Activity 都不會重新創建實例,和 singleTop 模式一樣,系統也會回調其 onNewIntent。
? ? 注意,這里我們分 3 種情況來理解這個 launchMode:
?? ?1. 被啟動的 Activity 任務棧不存在:
? ??? ? 此時會新建一個該 Activity 的任務棧,并將 Activity 實例放到任務棧中。
?? ?2. 被啟動的 Activity 任務棧存在,但是任務棧中該 Activity 實例不處于棧頂而在棧內:
? ??? ? 此時會先將該 Activity 實例上面的其它 Activity 實例全部出棧(因為該啟動模式默認具有 clearTop 效果)并將要啟動的 Activity 實例置于棧頂,系統調用其 onNewIntent 方法。
?? ?3. 被啟動的 Activity 存在任務棧,而且該 Activity 實例在該任務棧棧頂位置:
? ? ?? ?直接復用任務棧中的該 Activity 實例,并調用其 onNewIntent 方法。
? ? 這里我們還需要注意一個 Activity 的屬性 TaskAffinity,可以翻譯為任務相關性。它標識了一個 Activity 所需要的任務棧的名字,默認情況下,所有 Activity 所需的任務棧的名字為應用的包名。這個屬性主要和 singleTask 啟動模式或者 allowTaskReparenting 屬性配對使用,在其它情況下沒有意義,為這個啟動的 Activity 的任務棧指定相應的名稱。
taskAffinity屬性:
那么什么是taskAffinity屬性呢,可以簡單的理解為任務相關性。
這個參數標識了一個Activity所需任務棧的名字,默認情況下,所有Activity所需的任務棧的名字為應用的包名
我們可以單獨指定每一個Activity的taskAffinity屬性覆蓋默認值
一個任務的affinity決定于這個任務的根activity(root activity也就是這個任務的棧低的activity)的taskAffinity
在概念上,具有相同的affinity的activity(即設置了相同taskAffinity屬性的activity)屬于同一個任務
為一個activity的taskAffinity設置一個空字符串,表明這個activity不屬于任何task
? ? ? ?很重要的一點taskAffinity屬性不對standard和singleTop模式有任何影響,即時你指定了該屬性為其他不同的值,這兩種啟動模式下不會創建新的task(如果不指定即默認值,即包名)
singleInstance(單實例模式)
? ? 單實例模式。這是一種加強的 singleTask 模式,它除了具有 singleTask 模式的所有特性外,還加強了一點,那就是具有此種模式的 Activity 只能單獨地位于一個任務棧中。
三個Flag
Intent 類里定義了很多 FLAG,這里我只說三種:
FLAG_ACTIVITY_NEW_TASK
僅僅通過intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);啟動的 Activity 即使 task 里已經有實例了,依然會在棧頂創建一個新的實例。
FLAG_ACTIVITY_SINGLE_TOP
僅僅通過intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);能夠實現 singleTop 啟動模式的效果,也就是僅在當前棧里判斷實例是否處于棧頂,在棧頂就復用,否則新建一個實例。
FLAG_ACTIVITY_CLEAR_TOP
清除目標 Activity上方所有的 Activity,如果目標 Activity 是 standard 的啟動模式且啟動時 intent 里沒有設置FLAG_ACTIVITY_SINGLE_TOP這個flag,那么棧里的目標 Activity 也會被 finish 掉,重新創建一個實例。
如果目標 Activity 是非 standard 的啟動模式或者啟動時設置了FLAG_ACTIVITY_SINGLE_TOP,就不會清除目標 Activity,執行其 onNewIntent() 方法。
Flag 組合設置:
僅僅通過intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);這兩行代碼來啟動的 Activity,如果棧里已有 Activity 的實例,那么清空此 Activity 及其以上的 activites,然后新建一個實例。
僅僅通過intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);能夠達到跟 singleTask 啟動模式的效果,如果棧里已有實例,則清空其上的 activies,然后走 onNewIntent()。