Activity的啓動模式

Activity的四種啓動模式與Intent對象 (帶FLAG_ACTIVITY_* 常量)共同決定activity組件在被調用時將要發生的動作。

在android裏,有4種activity的啓動模式,分別爲:
“standard” (默認)
“singleTop”
“singleTask”
“singleInstance”
 
四種模式主要可分成兩組 ,"standard" 和"singleTop" 活動屬於一個羣組, 另一個羣組包括 "singleTask" 和 "singleInstance" 。


   1) 如何決定所屬task  
       "standard" 或者 "singleTop" 的Activity 啓動模式可以多次被實例化。這些實例instances可以屬於任意的task,且可以位於任意的activity棧中。它們被啓動後將與調用startActivity方位於同一個task中(除非Intent對象包含FLAG_ACTIVITY_NEW_TASK屬性,在這種情況下將啓動一個新的task).。
    2) "standard" 與 "singleTop"啓動模式的區別只有一個方面::
“standard”對於每一個啓動Intent都會生成一個activity的新實例,每個Instance處理一個單個的Intent。
“singleTop”的activity如果在目標task的棧頂的話,則不生成新的該activity的實例,直接使用棧頂的實例,否則,生成該activity的實例。
singleTop要求如果創建intent的時候棧頂已經有要創建 的Activity的實例,則將intent發送給該實例,而不發送給新的實例。
當已經存在的activity實例處理新的intent時候,會調用onNewIntent()方法。
如果收到intent生成一個activity實例,那麼用戶可以通過back鍵回到上一個狀態;如果是已經存在的一個activity來處理這個intent的話,用戶不能通過按back鍵返回到這之前的狀態。
    在其它情況下————例如,如果一個“singleTop”Activity實例已經在目標task棧中存在,但是不在棧頂,又或者位於棧頂但不在目標task中——這時一個新的instance將會被創建且位於棧頂。
    舉例:現在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。


  3) 相比較而言,, "singleTask" 和"singleInstance" activities can only begin a task. 他們總位於activitity棧底部,而且,在某一時刻設備中只能擁有一個該activity實例。 — 有且只有一個task.
  4)  "singleTask" activity 允許別的 activities 位於其所在的task中。該activity位於活動棧stack根部, but other activities (necessarily "standard" and "singleTop" activities) can be launched into the same task. 
   相反, "singleInstance" activity不允許其它的activity成爲其所在的 task的一部分。“singleInstance”獨佔一個task,它是所在task中的唯一的activity, 如果它啓動了一個新的 activity,不管新的activity的launch mode 如何,新的activity都將會到別的task裏運行(如同加了FLAG_ACTIVITY_NEW_TASK參數)。
For more information on launch modes and their interaction with Intent flags, see the Activities and Tasks section of the Application Fundamentals document.
它們主要有如下不同:
 
1. Intent的幾種有關Activity啓動的方式有哪些,你瞭解每個含義嗎?


Intent的一些標記有

FLAG_ACTIVITY_BROUGHT_TO_FRONT 、

FLAG_ACTIVITY_CLEAR_TOP、如果被啓動的activity已經運行在當前 task,將不會再創建新的活動實例,位於其上的其它activity將會被關閉。

FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET、

FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS、新的活動將不會只在在最近活動列表當中
FLAG_ACTIVITY_MULTIPLE_TASK
FLAG_ACTIVITY_SINGLE_TOP    如果目標Activity已經運行在棧頂,將不會再啓動 
FLAG_ACTIVITY_NEW_TASK :


   當傳遞給startActivity()的Intent對象包含FLAG_ACTIVITY_NEW_TASK標記時,系統會爲需要啓動的activity尋找與當前activity不同的task,如果要啓動的activity的affinity屬性與當前所有的task的affinity屬性不相同,系統會新建一個帶那個affinity屬性的task,並將要啓動的activity壓到新建的task棧中;否則將activity壓入那個affinity屬性相同的棧中。

      2)相比較而言, "singleTask" 和 "singleInstance" 啓動模式的activitity只能開啓一個新的task(有且只有一個 task)。它們總是在activity棧的根部。而且,設備上在某一時刻只能擁有該activity的一個Instance。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章