Android之android:launchMode


說明一下, 大家看這個帖子之前對Task,有一定的了解。而且看完這個之后,最好再看看taskAffinity屬性,因為在實際應用中他們一般是聯合使用的。

在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鍵到主界面,就會回不去了,因為它不代表一個應用的啟動。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM