[Android基礎]Android之android:launchMode(Activity啓動模式)

在Android的中Activity有4種啓動方式:"standard"、"singleTop"、"singleTask"、"singleInstance"。

下面就分輕重點講講這些啓動方式。
1、standard啓動方式
這種方式也是系統默認的。說的簡單點,我們在使用startActivity()方法的時候,系統就會啓動一個新的Activity實例,不管它先前啓動沒有。如果想知道具體細節可以查看這個帖子http://marshal.easymorse.com/archives/2950,我在這裏就不細細講解了。
配圖說明:

2、singleTop啓動方式
如果大家把standard啓動方式看懂了,這個我就說一下區別,大家就明白了。如果我們要調用的Activity在Task棧頂,系統不會像在standard方式下創建一個新的實例,而是調用onNewIntent()方法,來引導intent到棧頂的實例。如果調用的Activity不在Task棧頂,系統此時調用方式與standard方式下的一模一樣。
舉個例子:

現在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 無對應

 

補充說明裏面遺漏的東西

用戶一定要能夠離開一個task,和再回到這個task。所以,"singleTask"和"singleInstance",只能用作啓動Activity的屬性。如果不這樣,我們在啓動一個singleTask的Activity之後,使用Home鍵到主界面,就會回不去了,因爲它不代表一個應用的啓動。
 
 
 
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章