管理 Activity 的 Task 二
以下内容是对官方文档「Understand Tasks and Back Stack - Managing Tasks」的手动翻译
处理 Task 关联
affinity 指的是 Activity 指定和哪个 Task 关联。默认情况下,同一个应用的每个 Activity 都有 affinity 属性且都是相同的。不过我们可以修改默认 Task 关联。不同应用的 Activities 可以公用一个 或者同一个应用也可用不同的。
通过< activity >节点下的 taskAffinity 属性可进行修改。
taskAffinity 的值是一个字符串,默认值就是包名,这能够确保唯一性而不会和其他应用重复。
taskAffinity 属性在以下两种情况下生效:
-
通过 intent 并设置标记为 FLAG_ACTIVITY_NEW_TASK 启动 Activity时。
「如果通过这种方式,系统会为 Activity 新建一个 Task,不过如果如果已经有相同的 affinity 的 Task 存在,就不会再新建」
「如果某个 Activity 启动时新建了 Task,用户又按 Home 键退到了后台,这种情况要考虑用户怎么能回来。一些入口(例如通知管理)通常以这种方式启动,这种情况我们需要考虑通过启动图标等方式可以切回来。」 -
Activity 的 allowTaskReparenting 为 true 时。
这种情况下,当 affinity 属性指定的 Task 在前台时,Activity 可以从它启动的 Task 里跑到 affinity 属性指定的 Task 里。
例如,假设一个旅游应用里有个展示天气预报的 Activity,它设置了属性 allowTaskReparenting 为 true,当我们的 Activities 启动了这个天气预报 Activity,它就会归属到我们的 Task 里,但是当那个旅游应用重新回到前台时,这个天气预报 Activity 又回到了旅游应用的 Task 里去了。
清理 Back Stack
当 Task 被切到后台,并很久很久没有调回到前台时,系统就会将 Task 里的 Activities 清除,但还是会留一个栈底 Activity。 系统认为这么久了用户都不用那就可能是不要了,所以就都清理了,至于留一个栈底,是为了方便用户展开新的操作。
不过可以通过以下属性来控制:
-
alwaysRetainTaskState
如果在根 Activity 上设置该属性为 true,那么无论多长时间,系统都会为你保留,都会等你。 -
clearTaskOnLaunch
和 alwaysRetainTaskState 相反,每次都会仅保留一个栈底 Activity 不管是切到后台很久还是就切后台又切前台那么一瞬间。 -
finishOnTaskLaunch
这个和 clearTaskOnLaunch 有点像,但仅针对单个 Activity,意思就是说,当切到后台后,这个 Activity 就会被清掉,下次需要会重建。这个属性适用于栈里所有 Activity 不管是不是栈底。
启动一个 Task
通过设置 intent filter 的 action 为 "android.intent.action.MAIN",category 为 "android.intent.category.LAUNCHER" 可以指定某个 Activity 为 Task 的入口(也就是应用的入口)
<activity ...>
<intent-filter ...>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
像这样的 intent filter 配置,会在桌面上生成一个启动图标和描述,这样用户就可以它启动 Activity 或者恢复之前启动的 Task。
用户能通过这个启动图标再次打开恢复之前的状态,这点相对更重要。基于这个原因,"singleTask" 和 "singleInstance" 应该更适用于像这样配置了 ACTION_MAIN 和 CATEGORY_LAUNCHER 的 Activity 上。例如,一个设置启动方式为 "singleTask" 的 Activity,用户在上面做了很多操作,但还没结束退到了后台,但是用户想返回继续操作时,完了,用户发现找不到入口了。「这段话总的意思应该是想强调 intent filter 这样配置成启动项的优点,而不是说 "singleTask" 或 "singleInstance" 一定要搭配使用」