Tuesday, May 24, 2011

Android: Activity, Task, and Back Stack

最近又開始在跟Android培養感情XD,
在看Fragment的時候發現有些觀念還是有些模糊,
於是又回來看Activity溜.
順便做個筆記.

[1] Activity
- An activity is an application component that provides a screen with which users can interact in order to do something.
- activity是構成application的單元, 它專門負責某個功能並且提供界面讓使用者能與它互動.

[2] Task
- A task is a collection of activities that users interact with when performing a certain job.
- 在使用者操作app的時候會接連的喚起不同的activity, task指的就是這一連串activity. 在一般情況所有被同一個app喚起的activity會屬於同一個task, 但我們可以透過在以下方式指定activity歸屬於task的規則:
1. 喚起activity時下條件: 利用Intent
2. 設定activity本身的屬性: 利用Manifest

[3] Back Stack
- The activities are arranged in a stack (the "back stack"), in the order in which each activity is opened.
- 每個task都會有對應的back stack來存放所有屬於它的activity, 依照activity被喚起的順序來排列, 最新的在上面. 當使用者按了BACK鍵, 最上方的activity就會從back stack中移除, 回到前一個activity.


(上圖中所有的activity都屬於同一個task, 按了BACK後會從Activity 3回到Activity 2.)

[4] Application, Activity, Task, and Back Stack
- 當使用者開啓某個app後, 若是這個app的task已經存在, 則這個task則會被叫回前景繼續執行. 若不存在, 系統則會為app開啓新的task並將"main" activity放在back stack中
- 若使用者連續的按BACK鍵, activity會依序從stack中移除, 直到stack變成空的, 此時這個task也不再存在. 這時將會回到Home畫面或者是將這個task叫起來的task(完全是在繞口令XD)

[5] Activity and Task

要怎麼指定activity該如何以及連結到哪個task呢? 就是透過在manifest中設定activity的launch mode或是在用intent喚起activity時帶特殊的launch mode flag. 有些launch mode只能用manifest指定, 有些launch mode只能透過intent指定, 有些則都可以. 既然呼叫者可以指定, 被被呼叫者也能指定, 那是否會產生衝突呢? 答案是不會的. 透過intent下的launch mode具有較高的優先權.

1. 在manifest設定activity的launchMode屬性

(1) "standard" (the default mode)
- 每次這個activity被喚起時, 系統都會產生一個新的instance並且其將歸屬於把它喚起的那個task. 具有這種屬性的activity可同時有多個instance存在於系統中, 這些instance能屬於同一個或不同的task.

(2) "singleTop"
- 這個activity被喚起時如果已有instance被放在此task的back stack最上方, 系統將不會產生新的instance而是用onNewIntent()把原來的instance叫起來. 若沒有的話系統會產生一個新的instance. 具有這種屬性的activity也可同時有多個instance存在於系統中, 這些instance能屬於同一個或不同的task.


(a) 喚起launch mode為"standard"的activity D
(b) 喚起launch mode為"singleTop"的activity D
(c) 喚起launch mode為"singleTop"的activity B

(3) "singleTask"
- 這個activity同時間只會有一個instance存在於系統中. 當這個activity被喚起時, 如果已有instance存在於某個task, 那系統將不會產生新的instance而是用onNewIntent()把原來的instance叫起來. 若沒有的話系統會產生一個新的instance並且將其歸屬於此新的task.


(要注意的是: 屬性為"singleTask"的Activity Y被叫起, Task B也因此被叫到前景, 在使用者按BACK鍵後, 繼續在前景執行的還是Task B.)

(4) "singleInstance".
- 跟singleTask大致上相同. 唯一的差別在於這個activity的instance所存在的task中只能有instance. 這個activity之後喚起的activity的instance會歸屬於其他的task.

2. 透過intent加上flag設定

(1) FLAG_ACTIVITY_NEW_TASK: 和singleTask行為相同

(2) FLAG_ACTIVITY_SINGLE_TOP: 和singleTop行為相同

(3) FLAG_ACTIVITY_CLEAR_TOP
- 如果被喚起的activity已有instance存在目前的task中, 則所有在back stack中比此instance新的activity將會被移除. 故此instance將會收到onNewIntent()並開始運作.

其他可設定的特性

[6] Activity Attributes

其他可以在manifest中設定的屬性
-taskAffinity
-launchMode
-allowTaskReparenting
-clearTaskOnLaunch
-alwaysRetainTaskState
-finishOnTaskLaunch

ref:
1. Tasks and Back Stack
2. Activities

No comments:

Post a Comment