搜尋此網誌

2016年2月16日 星期二

【Android】 Activity launchMode

ref:
http://developer.android.com/intl/zh-tw/guide/topics/manifest/activity-element.html#lmode http://developer.android.com/intl/zh-tw/guide/components/tasks-and-back-stack.html
http://img.my.csdn.net/uploads/201109/6/0_1315306406qQQp.gif

          android:launchMode=["multiple" | "singleTop" | 
                              "singleTask" | "singleInstance"]
Activity的四種launchmode,可在androidManifest.xml中定義。

  1. standard
    • 顧名思義,標準模式。
    • 若在androidManifest.xml中的<activity ...>,沒有定義launchMode,則會以此模式來跑。 (不要問我為什麼,上面的multiple,和這裡寫的standard不同,開發手冊就這樣寫。若真要定義的話,是寫"standard"無誤。
    • 每次執行都會create新的activity instance。
    • 因為同一個activity會被create多次,所以一個task有多個instance。
    • 例子:
      • Task Back Stack中,由bottom至top分別為Activity A|B|C|D,其中D未定義launchMode,所以是預設為standard模式。
      • 當Activity D再次被呼叫時,Back Stack由bottom至top會變為Activity A|B|C|D|D。
  2. singleTop
    • 欲呼叫該activity存在在stack top,不會重新create新的activity instance;反之,會重新呼叫。
    • 舉例來說
      • Back Stack由bottom至top分別為Activity A|B|C|D,其中D定義launchMode為singleTop模式。
      • 當Activity D再次被呼叫時,Back Stack依然是Activity A|B|C|D。
      • 若Activity B也定義launchMode為singleTop模式,當Activity B再次被呼叫時,Back Stack會在put B,成為Activity A|B|C|D|B。
  3. singleTask
    • 在同一個Task back stack中,只為存在唯一的Activity。
    • 當發現呼叫的Activity已存在在stack中,則會pop此activity上的其他activity,直到欲呼叫的Activity維持在stack top端。
    • 當發現呼叫的Activity不存在在stack中,當然就create新的Activity,並push到back stack中。
    • 例子:
      • Back Stack由bottom至top分別為Activity A|B|C|D,其中B定義launchMode為singleTask模式。
      • 當在Activity D,使用startActivity()...再次呼叫Activity B時,Back Stack變為Activity A|B。
  4. singleInstance
    • Activity永遠只存在一個task中,且它是唯一的Activity。
    • 例子:
      • Activity A開啟模式是定義standard,Activity B定義為singleInstance。A已開啟,接者啟動B,在啟動A。back stack會成為如下所示:
      • Activity A(task id 1) → Activity B(task id 2) → Activity AA(task id 1)。<此處A和AA都是一樣的Activity,為了講解方便,區別一下>。
      • 當按下back鍵,會變為Activity AA(task id 2) → Activity A(task id 1) → Activity B(task id 2)













有點複雜,但還沒想到可以活用的例子。先這樣。

另外,也可在startActivity()中定義intent flag,也可修改activity launchMode。

  • FLAG_ACTIVITY_NEW_TASK
    • 如同singleTask所作之動作。
  • FLAG_ACTIVITY_SINGLE_TOP
    • 如同singleTop所作之動作。
  • FLAG_ACTIVITY_CLEAR_TOP
    • 如果正在啟動的 Activity 已在目前的工作中執行,則不會啟動新的 Activity intent,而是會終結位於其上方的所有其他 Activity,且此intent會透過 onNewIntent() 傳送到繼續執行的 Activity 執行個體 (現在位於頂端)。
FLAG_ACTIVITY_CLEAR_TOP 最常與 FLAG_ACTIVITY_NEW_TASK 搭配使用。 一起使用時,這些旗標可以找出位於其他工作中的現有 Activity,然後將它放置於可以回應意圖的地方。

沒有留言: