2011-12-23

Tags: 程式語言 , android , java

Task指一連串Activity記錄歷程(e.g. A activity -> B activity -> C activity -> A activity)。Task可以跨Application,也就是說不同Application的Activiy可能會在同個Task中(e.g. App1's A activity -> App1's B activity -> App2's X activity -> App1's B activity)。

由Task的既念,衍生出Activity記錄歷程相關的議題。Activity記錄歷程存放在Activity Stack之中,又因為是Stack的結構,所以它的資料是LIFO(後進先出)。

 Activity Stack中,每個Activity的存放順序與邏輯是由AndroidManifest.xml裡,Activity tag的"android:launchMode"屬性來設定。然後..."android:launchMode"屬性裡的設定值表示的意義很 它媽的 難懂,官方原文的說明在 這裡,基本上看完你就知道怎麼回事,那真的是神人一個。

直到我很好運的找到下面這超簡單清楚的佛心文之後,我終於真正了解"android:launchMode"屬性是怎麼一回事了(以前搞不太清楚前,只敢用standard跟singleTop,免的app出包)。
activity - android:launchMode(1) - standard介紹
activity - android:launchMode(2) - singleTop介紹
activity - android:launchMode(3) - singleTask介紹
activity - android:launchMode(4) - singleInstance介紹
activity - android:launchMode(5) - onNewIntent()目的

Activity的"android:launchMode"屬性的四種設定值說明摘要如下

  1. standard(預設值):在每次被叫用時都產生新的instance。
  2. singleTop:如果是在Activity Stack的最頂層,被叫用時不產生新的instance,其它狀況下則會產生新的instance。
  3. singleTask:在目前這個Application所屬的Task中,只會存在一個instance。在這個instance未被清出Activity Stack前,若遇到重覆叫用,會一直reuse現有的instance。此外,從其它Activity跳轉到這個instance時,在Activity Stack這個instance之上的所有Activity都會被清掉(e.g. 執行"A(standard) -> B(standard) -> C(singleTask) -> D(standard) -> E(standard) -> C(singleTask)"的動作,執行後整個Activity Stack裡的資料從底端到頂端依序是"A、B、C","D、E"會被自動清掉)
  4. singleInstance:第一次被叫用時,產生新的instance,並把它放到新的Task,但是該Task只會存放這一個instance。在這個instance未被清出Activity Stack前,若遇到重覆叫用,會一直reuse現有的instance。
在某些狀況下,將Application的首頁Activity屬性設成singleTop、singleTask會非常實用。比較吃系統資源又需要一直reuse的Activity則是可以考慮設成singleInstance。