- standard,創建一個新的Activity。
- singleTop,棧頂不是該類型的Activity,創建一個新的Activity。否則,onNewIntent。
- singleTask,回退棧中沒有該類型的Activity,創建Activity,否則,onNewIntent+ClearTop。
- singleInstance,回退棧中,只有這一個Activity,沒有其他Activity。
standard
簡介:
每次激活Activity時(startActivity),都創建Activity實例,并放入任務棧;
應用場景:
比如從應用列表頁中,點擊應用詳情,就可以用standard,一般情況下,都可以用standard。
singleTop
簡介:
如果某個Activity自己激活自己,即任務棧棧頂就是該Activity,則不需要創建,其余情況都要創建Activity實例;
應用:
- 在通知欄點擊收到的通知,然后需要啟動一個Activity,這個Activity就可以用singleTop,否則用戶如果連續點擊好幾次,每次都會新建一個Activity。
- 實際的開發過程中,測試妹紙沒準給你提過這樣的bug:某個場景下連續快速點擊,啟動了兩個Activity。如果這個時候待啟動的Activity使用 singleTop模式也是可以避免這個Bug的。
- 在開發過程中,我們有一個場景是從城市列表頁選擇東京,跳到東京頁,再從東京頁跳到大阪頁,其實東京頁和大阪頁都是同一個activity,我們需要從大阪頁點擊返回時,能夠直接回到城市列表頁,這個時候,用singleTop也是能夠很好解決這個問題的。
singleTask
簡介:
如果要激活的那個Activity在任務棧中存在該實例,則不需要創建,只需要把此Activity放入棧頂,并把該Activity以上的Activity實例都pop;
應用
- 最近在做的,在問題詳情頁,點擊進入回答頁,回答完并finish后,回到問答詳情頁;如果問題詳情頁采用standard方式,將兩次創建問題詳情頁,而采用singleTask則可避免該問題。
- 例如瀏覽器的主界面。不管從多少個應用啟動瀏覽器,只會啟動主界面一次,其余情況都會走onNewIntent,并且會清空主界面上面的其他頁面。
singleInstance
簡介
這個模式非常接近于singleTask,系統中只允許一個Activity的實例存在。區別在于持有這個Activity的任務中只能有一個Activity:即這個單例本身。
應用
- 例如鎖屏、電話、鬧鈴提醒,將鬧鈴提醒與鬧鈴設置分離。
- singleInstance不要用于中間頁面,如果用于中間頁面,跳轉會有問題,比如:A -> B (singleInstance) -> C,完全退出后,在此啟動,首先打開的是B。
-
如果應用1的任務棧中創建了MainActivity實例,如果應用2也要激活MainActivity,則不需要創建,兩應用共享該Activity實例;
參考
singleInstance模式下的坑
singleInstance作為中間頁的問題
Activity的LaunchMode應用場景思考