在Android的中Activity有4種啟動方式:"standard"、"singleTop"、"singleTask"、"singleInstance"。
現在task棧元素為A-B-C-D(D在棧頂),這時候給D發一個啟動intent,如果D是 “standard”的,則生成D的一個新實例,棧變為A-B-C-D-D。
如果D是singleTop的話,則不會生產D的新實例,棧狀態仍為A-B-C-D
如果這時候給B發Intent的話,不管B的launchmode是”standard” 還是 “singleTop” ,都會生成B的新實例,棧狀態變為A-B-C-D-B。
注意:在一個Activity處理新的intent的時候,用戶不能使用Back button來返回到先前的Activity。直到新的intent到達onNewIntent()方法中后,才可以。
3、singleTask啟動方式
如果已經有其他的Task並且包含Activity實例,那就直接調用那個Task的實例。(只有一個Task中會有) 而不是創建一個新的實例。重點:假如你啟動一個singleTask的Activity,同時這個Activity在background task中,那么整個background task都會被調入到前台來。下面這幅圖就很好的說明這個問題。
有人問如果我調用圖中的Activity X,會怎樣?系統會先把Activity Y銷毀,然后再將Activity X放到前台。
4、singleInstance啟動方式
singleInstance 新建一個Task,且在該Task中只有它的唯一一個實例。 (只有一個Task會有,且該Task中只有它)。“singleInstance”是其所在棧的唯一activity,它會每次都被重用。
總結:
standard 每次都會新建,每個Task都可以有,且每個Task都可以有多個實例(每個Task都可以有,且可以有多個)
singleTop 當前實例如果在棧頂,就不新建實例,調用其OnNewIntent。 如不在棧頂,則新建實例 (每個Task都可以有,且可以有多個,在棧頂時可復用)
singleTask 新建一個Task,如果已經有其他的Task並且包含該實例,那就直接調用那個Task的實例。(只有一個Task中會有)
singleInstance 新建一個Task,且在該Task中只有它的唯一一個實例。 (只有一個Task會有,且該Task中只有它)
intent的flag可以覆蓋activity的啟動模式:
FLAG_ACTIVITY_NEW_TASK 類似singleTask
FLAG_ACTIVITY_SINGLE_TOP 類似singleTop
FLAG_ACTIVITY_CLEAR_TOP 無對應
補充說明里面遺漏的東西。