程式執行時 Activity 會以堆疊的方式存放在 Task 中,也就是說 Task 是一個 Activity 的集合(通常一個 App 就會有一個 Task)。
Activity 有 4 種 啟動模式,啟動模式會影響 Activity 在 Task 的堆疊中進出的方式。
每次 intent 都會啟動新的獨立的 Activity
若 intent 至其他 App 的 Activity
會產生一個新的 Task 及 Activity,並將新 Activity 放在新 Task 中
(例如從 A App 點選寄信彈出 Email App 的視窗)
若要 intent 的 Activity 已經存在於 task 的最頂端
會直接 intent 至已存在於頂端的 Activity(透過 onNewIntent() 方法)
若不在 task 最頂端,則同 standard 一樣會啟動新的獨立的 Activity
舉例:
task 中有 Activity A-B-C-D,根為 A,頂端為 D
- 若 intent 至 D,因 D 為為頂端,故會透過 onNewIntent() 方法 intent 至現有的 D Activity
因此 task 中 仍為 A-B-C-D- 若intent至B,因B非頂端,故會執行出新的Activity
task 中會變為 A-B-C-D-B
該 Activity 只能存在於一個 task 中。
若要 intent 的 Activity 已存於某 task 中,則會透過 onNewIntent() 方法直接 intent 至該 Activity,且會結束掉該 Activity 上層所有的 Activity,使目前 intent 的 Activity 處於最上層。
若含有要 intent 的 Activity 的 task 在背景作業,則會將該整個 task 移至前景,並結束目標 Activity 上面的所有Activity。
若要 intent 的 Activity 尚未存在,則會先在系統中查找屬性值 Affinity 等於該 Activity 的屬性值 taskAffinity 的 task ,如果存在這樣的 task,就會在該 task 中啟動新的 Activity 並至於頂端。
一般來說如果沒有特定設 taskAffinity,同一個專案預設會是一樣的 taskAffinity。
若要 intent 的 Activity 尚未存在,且未找到屬性值 Affinity 等於該 Activity 的屬性值 taskAffinity 的 task,則建立新的 task 並啟動新的 Activity(新 Activity 為該 task 的根)。
實作時若希望 intent 時建立新 task 並啟動 Activity,可透過為 singleTask Activity 設置 taskAffinity 屬性,讓該 Activity 的 taskAffinity 屬性與專案不同而達到效果。
該 Activity 所在的 task 只能有唯一一個 Activity(即該Activity)。
啟動 Activity 時會建立新的 task 且該 task 中只會執行該Activity。
您好,本人最近才開始碰Android ,最近對App的Activity有點疑問,看了您的文章,想請問
啟動 1 App = 1 Task = 1 or more Activity
可以這樣理解麼??
不好意思現在才看到你的留言~
1 App = 1 Task 這個等式不一定成立唷~
Task 只能說是一些 Activity 的集合
同一個 App 的 Activity 有可能在不同的 Task 中
(例如將某個 Activity 的啟動模式設成 singleInstance 時)
一個 Task 裡也可能有不同 App 的 Activity
(例如不同的 App 擁有相同的 taskAffinity)