Android Launch modes使用分析整理

定義不同的Launch Modes有兩種方法,如下

1. 使用manifest檔案

2. 使用Intent flags

Launch modes為Activity的Back Stack行為與Activity A呼叫Activity B的Stack行為

Launch modes預設為:standard(標準模式)

更換mode兩種方式如下

<activity android:name=".ThreeActivity"
android:launchMode="singleTask">
</activity>
val intent = Intent(this, ThreeActivity::class.java)
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
startActivity(intent)

備註

更換Launch modes時,記得Build -> Clean Project,否則有時候異常

使用manifest設定,各模式操作流程如下

1. standard(default)

如下所示,可以一直放入新的Activity,後進先出

A is standard

B is standard

C is standard

以下task id皆相同

A -> B -> A -> B (Last Stack -> ABAB)

A -> B -> C -> A -> C -> B (Last Stack -> ABCACB)

A -> B -> B (Last Stack -> ABB)

2. singleTop

呼叫onNewIntent,back後,下次呼叫就會是onCreate,保持單一Top

如下所示

A is standard

B is singleTop

C is singleTop

以下task id皆相同

A -> B -> A -> B (Last Stack -> ABAB)

A -> B -> C -> A -> C -> B (Last Stack -> ABCACB)

A -> B -> B (第二次呼叫的B是onNewIntent,Last Stack -> AB)

3. singleTask

保持單一Task

如下所示

A is standard

B is singleTask

C is singleTask

以下task id皆相同

A -> B -> A -> B (第二次呼叫的B是onNewIntent,Last Stack -> AB)

A -> B -> C -> A -> C -> B (第二次呼叫的B與C皆是onNewIntent,Last Stack -> AB)

A -> B -> B (第二次呼叫的B是onNewIntent,Last Stack -> AB)

4. singleInstance

保持單一Instance

如下所示

A is standard

B is singleInstance

C is singleInstance

A -> B -> A -> B (第二次呼叫的B是onNewIntent)

task id = 1, AA

task id = 2, B

A -> B -> C -> A -> C -> B (第二次呼叫的B與C皆是onNewIntent)

task id = 1, AA

task id = 2, B

task id = 3, C

A -> B -> B (第二次呼叫的B是onNewIntent)

task id = 1, A

task id = 2, B

使用Intent flags,方法如下

1. FLAG_ACTIVITY_NEW_TASK

相同於singleTask

2. FLAG_ACTIVITY_SINGLE_TOP

相同於singleTop

3. FLAG_ACTIVITY_CLEAR_TOP

清除自己以外的Stack,通常與FLAG_ACTIVITY_NEW_TASK一起用

intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK

A -> B -> C 原本 Last Stack -> ABC

在B啟動C時,將C設定此旗標後,Last Stack -> C

taskAffinity

設定android:taskAffinity

<activity android:name=".MainActivity">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

<activity android:name=".SecondActivity"
    android:launchMode="singleTask"
    android:taskAffinity=".SecondActivity">
</activity>

<activity android:name=".ThreeActivity"
    android:launchMode="singleTask">
</activity>

上方設定好後,起初是在A,依序呼叫B -> A -> A -> C -> A

taskid = 1, A -> C -> A

taskid = 2, B -> A -> A

按功能鍵的menu,會發現App變成兩個了
但實質上是兩個Task

Activity attributes

默認行為:長時間離開任務,返回後將會重新開始任務

1. alwaysRetainTaskState

設定為true時,不管離開多長時間都不會重新開始任務,任務依然會在Stack中

2. clearTaskOnLaunch

與alwaysRetainTaskState相反,在root Activity設為true時,即使離開片刻,返回時,只會剩下root Activity

假設Stack, A -> B -> C

點App圖示,重新進入入App,Stack, A

3. finishOnTaskLaunch

與clearTaskOnLaunch相似,是對單個Activity而不是整個Task,除了root Activity外,

設為true時,App如果在C,手機按Home key離開了App,返回時,將會看到B,C會被結束掉

假設Stack, A -> B -> C

點App圖示,重新進入App,Stack, A -> B

Starting a task

以下是App最初Activity入口,預設專案建立好,就已經設定了

<activity ... >
    <intent-filter ... >
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
    ...
</activity>

相關文章

Android生命週期Android 新增Lifecycle觀察
Android startActivity其他用法Android startActivityForResult棄用?

訂閱Codeilin的旅程,若有最新消息會通知。

廣告

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com 標誌

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

連結到 %s

透過 WordPress.com 建置的網站.

向上 ↑

%d 位部落客按了讚: