Hank Li

Aug 16, 2019

5 min read

分享 Android Activity’s launchMode

Stack

身為 Android 開發者當然知道 Activity 這個元件,當 App 啟動時,系統會建立一個 Back Stack 來存放 Activities,當新開 Activity,系統會根據 Activity 的 launchMode 做相對應的動作,今天就要來分享 Activity 的四種 launchMode (standard, singleTop, SingleTask, SingleInstance)

如何設定 launchMode

開發者可以透過 AndroidManifest.xm 設定 Activity 的 launchMode (啟動模式)

AndroidManifest.xml 設定 launchMode

查看 Back Stack 工具

Android 官方提供 adb shell dumpsys 指令來查看系統資訊,這個工具很厲害的地方是,它可以將手機內還活著的 Back Stack 全都顯示出來,不單只有目前顯示的 Back Stack

下面提供的指令是只查看 Activities 的 Back Stack

adb shell dumpsys activity activities | sed -En -e ‘/Running activities/,/Run #0/p’

四種啟動模式

在開始前先介紹一下我使用的 Demo,裡面有三個 Activity (分別為 A, B, C),每個 Activity 可以開啟 A, B, C 任何一個Activity,透過設定 launchMode 來看一下 Back Stack 的狀態

此模式為預設,當 Activity 被啟動,系統建立一個新的 Activity 實例,Activity 可以被實例化多次

全部設為 standard

範例:A -> B -> C

由 A 啟動 B,再由 B 啟動 C,根據 Back Stack 中看到 A 在最底層,在上面的是 B,最頂層是 C

此時再啟動 C,也就是 A -> B -> C -> C

從 Back Stack 中看到 C 有兩個實例,每新開一個 Activity 都會產生一個新的實例

當 Activity 已經在 Back Stack 最上層,就不再實體化

要測試之前先將 B 改為 singleTop

B 設定為 singleTop

範例:A -> B -> B

疑?怎麼只有 A 跟 B,是的,你沒看錯,設定為 singleTop 的時候,當該 Activity 已經在最上層時就不會再實例化,但是...

範例:A -> B -> C -> B

請注意!此時會有兩個 B 實例,當該 Activity 不在最上層時還是會產生新的實例

當 Activity 已經存在 Back Stack 中,就不再實例化,並會將上層的 Activity 都移除

要測試之前先將 B 改為 singleTask

B 設定為 singleTask

範例:A -> B -> C -> B

我們先試 A-> B -> C,在此先看一下 Back Stack

恩,沒問題~確實是 A -> B -> C,然後啟動 B

C 消失了?沒錯!因為 B 設定為 singleTask,所以當 C 啟動 B 時,系統會從 Back Stack 找到 B 的位子,並將在 B 上層的 Activity 都移除

設定為 singleInstance 的 Activity 是此 Back Stack 單一且唯一的 Activity,此 Activity 啟動的任何其他 Activity 都會被丟到另一個 Back Stack

要測試之前先將 B 改為 singleInstance

B 設定為 singleInstance

範例:A -> B -> C

我們先試 A,在此先看一下 Back Stack

恩,沒問題,接著啟動 B

差點閃尿,有沒有~啟動 B 時,新開了一個 Back Stack,然後啟動 C

C 被加到原本的 Back Stack,此時按下返回鍵

先回到 A,再按一下返回鍵

只剩下 B 且不同於原本的 Back Stack

結語

官方建議使用 standard 模式即可,如果真的有需要,再依照需求進行修改

如有任何問題或批評指教,歡迎您留言告訴我!
請各位給我點掌聲!謝謝各位的觀賞.

Shares Android development and Kotlin programming.

Love podcasts or audiobooks? Learn on the go with our new app.