iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 12
0
Software Development

英國研究顯示,連續30天用Kotlin開發Android將有益於身心健康系列 第 12

Android - Activity 啟動模式

程式執行時 Activity 會以堆疊的方式存放在 Task 中,也就是說 Task 是一個 Activity 的集合(通常一個 App 就會有一個 Task)。

Activity 有 4 種 啟動模式,啟動模式會影響 Activity 在 Task 的堆疊中進出的方式。

standard(預設模式)


  • 每次 intent 都會啟動新的獨立的 Activity

  • 若 intent 至其他 App 的 Activity
    會產生一個新的 Task 及 Activity,並將新 Activity 放在新 Task 中
    (例如從 A App 點選寄信彈出 Email App 的視窗)

singleTop


  • 若要 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
  • 若設定為singleTop的Activity並無位於頂端,則會照standard模式執行

singleTask


該 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 屬性與專案不同而達到效果。

singleInstance


該 Activity 所在的 task 只能有唯一一個 Activity(即該Activity)。

啟動 Activity 時會建立新的 task 且該 task 中只會執行該Activity。

參考:圖片來源及參考資料


上一篇
Android Kotlin 實作 Day 8:BottomNavigation(下)(FragmentTransaction + BottomNavigationView)
下一篇
Android Kotlin 實作 Day 9:ImageSlider(使用 ViewPager)
系列文
英國研究顯示,連續30天用Kotlin開發Android將有益於身心健康30

1 則留言

0
阿毛
iT邦新手 5 級 ‧ 2018-12-19 23:14:38

您好,本人最近才開始碰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)

我要留言

立即登入留言