定義不同的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

但實質上是兩個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>