第 1 章 Activity 的启动模式

1.2 Activity 的启动模式

前言:Activity 的启动模式在面试中也是经常被问到的,那么每个模式具体是什么样子,有没有记混淆了呢?

四种启动模式以及 TaskAffinity 属性

默认情况下,当我们多次启动同一个 Activity 时,系统会创建多个实例并把它们一一放入任务栈中,当我们点击 back 键时,这些 Activity 会一一回退,直到栈空为止,任务栈就是一种“后进先出”的栈结构。

  1. standard:标准模式,系统的默认模式。每次启动一个 Activity 都会重新创建一个新的实例,不管这个实例是否已经存在,然后压入启动它的那个Activity 的任务栈中。比如 Activity A 启动了 Activity B(B 是标准模式),那么 B 就会进入到 A 所在的栈中。
  2. singleTop: 栈顶复用模式。如果要创建的新 Activity 已经位于任务栈的栈顶,那么此 Activity 不会被重新创建,而是复用该 Activity,但是它的 onNewIntent 方法会被回调。比如栈内情况为 ABCD,A 位于栈底,D 为栈顶,假设再次启动 D,如果 D 的启动模式为 singleTop,那么栈内的情况依然为 ABCD;如果 D 的启动模式为 standard,那么 D 会被重新创建,栈内情况为 ABCDD。
  3. singleTask:栈内复用模式。这是一种单实例模式,在这种模式下,只要 Activity 在一个栈中存在,那么启动该 Activity 都不会被重新创建,而是复用该 Activity,系统将其调到栈顶,并移除其上的 Activity,它的 onNewIntent 方法会被回调。比如:
    • 目前任务栈 S1 的情况为 ABC,这个时候,Activity D 以 singleTask 模式请求启动,如果其所需要的任务栈为 S2,由于 S2 和 D 的实例都不存在,系统会先创建任务栈 S2,然后再创建 D 的实例并将其入栈到 S2。
    • 如果其所需要的任务栈为 S1,那么系统会直接创建 D 的实例并将其入栈到 S1。
    • 如果 D 所需的任务栈为 S1,当前 S1 情况为 ADBC,那么 D 不会重新创建,系统会把 D 切换到栈顶并调用 onNewIntent 方法,由于 singleTask 默认有 clearTop 的效果,会移除所有 D 上面的 Activity,最终 S1 的情况为 AD。
  4. singleInstance:单实例模式。这是一种加强的 singleTask 模式,具有 singleTask 模式的所有特性,此外该模式的 Activity 只能单独位于一个任务栈中,比如 A 为 singleInstance 模式,当 A 启动后,系统会为它创建一个新的任务栈,然后 A 独自在这个新的任务栈中,由于栈内复用的特性,后续的请求不会创建新的 Activity,除非这个独特的任务栈被系统销毁了。

TaskAffinity 参数标识了一个 Activity 所需要的任务栈的名字,默认情况下,所有 Activity 所需要的任务栈名字为应用的包名。我们可以为每个 Activity 单独指定 TaskAffinity 属性。TaskAffinity 属性主要和 singleTask 启动模式或者 allowTaskReparenting 属性配对使用。

当 TaskAffinity 和 singleTask 启动模式配对使用的时候,它是具有该模式的 Activity 的目前任务栈的名字,待启动的 Activity 会运行在名字和 TaskAffinity 相同的任务栈中。

当 TaskAffinity 和 allowTaskReparenting 结合的时候,这种情况比较复杂,会产生特殊的效果。当一个应用 A 启动了应用 B 的某个 Activity 后,如果这个 Activity 的 allowTaskReparenting 属性为 true 的话,那么当应用 B 被启动后,此 Activity 会直接从应用 A 的任务栈转移到应用 B 的任务栈中。比如:有 2 个应用 A 和 B,A 启动了 B 的一个 Activity C,然后按 Home 键回到桌面,然后再单击 B 的桌面图标,这个时候并不是启动了 B 的主 Activity,而是重新显示了已经被应用 A 启动的 Activity C,或者说 C 从 A 的任务栈转移到了 B 的任务栈中。可以这么理解,由于 A 启动的 Activity C,这个时候 C 只能运行在 A 的任务栈中,但是 C 属于 B 应用,正常情况下,它的 TaskAffinity 值肯定不可能和 A 的任务栈相同(因为包名不同)。所以,当 B 被启动后,B 会创建自己的任务栈,这个时候系统发现 C 原本想要的任务栈被创建了,就把 C 从 A 的任务栈中转移过来了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值