android 技术梳理

管理 Activity 的 Task 二

2021-01-01  本文已影响0人  jkwen

以下内容是对官方文档「Understand Tasks and Back Stack - Managing Tasks」的手动翻译

处理 Task 关联

affinity 指的是 Activity 指定和哪个 Task 关联。默认情况下,同一个应用的每个 Activity 都有 affinity 属性且都是相同的。不过我们可以修改默认 Task 关联。不同应用的 Activities 可以公用一个 或者同一个应用也可用不同的。

通过< activity >节点下的 taskAffinity 属性可进行修改。
taskAffinity 的值是一个字符串,默认值就是包名,这能够确保唯一性而不会和其他应用重复。
taskAffinity 属性在以下两种情况下生效:

清理 Back Stack

当 Task 被切到后台,并很久很久没有调回到前台时,系统就会将 Task 里的 Activities 清除,但还是会留一个栈底 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" 一定要搭配使用」

上一篇下一篇

猜你喜欢

热点阅读