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中定義。
- 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。
- 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。
- 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。
- 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,然後將它放置於可以回應意圖的地方。
沒有留言:
張貼留言