android任务栈
taskAffinity属性
- TaskAffinity参数标识着Activity所需要的任务栈的名称,默认情况下,一个应用中所有Activity所需要的任务栈名称都为该应用的包名。
- TaskAffinity 属性一般跟singleTask模式或者跟allowTaskReparenting属性结合使用
- 测试了下只有
singleTask和singleInstance有效果
- 测试了下只有
- TaskAffinity属性的值应该与当前应用包名相同,否则就没意义了
测试代码,清单文件
<activity android:name=".test.MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".test.ActivityA"
android:launchMode="singleTask"
android:taskAffinity="com.zejian.singleTask.affinity"
/>
通过命令:adb shell dumpsys activity activities可看出效果

allowTaskReparenting属性
它的主要作用是activity的迁移,即从一个task迁移到另一个task,这个迁移跟activity的taskAffinity有关。当allowTaskReparenting的值为“true”时,则表示Activity能从启动的Task移动到有着相同affinity值的Task。当allowTaskReparenting的值为“false”,表示它必须呆在启动时呆在的那个Task里。
默认的值是false
清理任务栈
长时间离开任务,则系统会清除所有 Activity 的任务,根 Activity 除外。 当用户再次返回到任务时,仅恢复根 Activity。系统这样做的原因是,经过很长一段时间后,用户可能已经放弃之前执行的操作,返回到任务是要开始执行新的操作。
但是可以修改这种默认行为
android:clearTaskOnLaunch
android:finishOnTaskLaunch
和android:clearTaskOnLaunch类似,但是区别在于finishOnTaskLaunch只作用于自己,而不会影响其他的activity。
android:alwaysRetainTaskState
如果任务中的根activity中设置了true,则不会出现上面的清理行为,即时很长时间,任务仍将所有的activity保留在堆栈中。
此属性只能对task中的根activity起作用,其他的activity则会被忽略。
场景:
如果一个应用在后台呆的太久例如30分钟,用户从主选单再次选择该应用时,系统就会对该应用的task进行清理,除了根Activity,其他Activity都会被清除出栈,但是如果在根Activity中设置了此属性之后,用户再次启动应用时,仍然可以看到上一次操作的界面。 这个属性对于一些应用非常有用,例如Browser应用程序,有很多状态,比如打开很多的tab,用户不想丢失这些状态,使用这个属性就极为恰当。