android activity压栈,Android Activity启动模式总结

简介

Activity 作为 Android 四大组件之一,几乎是被接触得最多的。Activity 中有个启动模式的概念,分别是 standard、singleTop、singleTask 以及 singleinstance,这篇文章总结一下这四种启动模式的特点。

任务栈

当我们打开一个 APP,第一个出现的 Activity 是我们指定的默认 Activity,通过这个 Activity 可以跳转到其它 Activity,按返回键可以依次返回到上一个 Activity。这是因为系统把我们打开的 Activity 放在一个任务栈中。打开第一个 Activity 时,系统会新建一个任务栈,如果继续打开新的 Activity,会创建新 Activity 的实例并且放到任务栈的栈顶,返回时将栈顶的 Activity 出栈,新的栈顶 Activity 将呈现在界面上,过程如下图。

bVu73j?w=617&h=195

这是默认情况下的任务的入栈出栈,如果指定了不同的启动模式将会有不同的表现。

standard

standard 是标准启动模式,当我们没有指定 Activity 的启动模式时,默认就是这种模式。在 standard 模式下,每次启动一个 Activity 都会创建一个新的实例,它的 onCreate、onStart 以及 onResume均会被调用。这个新创建的 Activity将会放在启动它的 Activity 所在的任务栈的栈顶。

比如 Activity A 在栈 S ,它启动了 Activity B(standard 模式),那么 B 将会进入 A 所在的栈 S。

如果在没有任务栈的情况下启动 standard 模式的 Activity,比如在 Service 中,此时新的 Activity 没有任务栈可入,会出现异常:

Caused by: android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?

此时应该为这个 Activity 指定 FLAG_ACTIVITY_NEW_TASK,这样就会新建一个任务栈。

singleTop

singleTop 是栈顶复用模式。在这种模式下,如果新启动的 Activity 已经在任务栈的栈顶了,那么就不会重新创建新的实例,而是调用这个 Activity 的 onPause、onNewIntent 以及 onResume 方法。如果新启动的 Activity 不是位于栈顶,那么还是会重新创建。

比如现在栈内情况是 ABCD 四个Activity,A 位于栈底,D 位于栈顶。如果 D 的启动模式为 singleTop,那么不会再次创建 D 的实例,栈内依然是 ABCD。

如果上面的 D 为 standard 启动模式,那么栈内将变为 ABCDD。

singleTask

singleTask 是栈内复用模式。这是最复杂的一种模式,因为它可能涉及到多个栈。当一个具有 singleTask 模式的 Activity 启动后,比如 Activity A,系统会首先寻找是否存在所需的任务栈,如果不存在,就重新创建一个任务栈,然后创建 A 的实例后把 A 放入到栈中。如果存在 A 所需要的任务栈,这时要看 A 是否在栈中有实例存在,如果有,那么系统就会把它调到栈顶并且调用它的 onNewIntent 方法,如果不存在,就创建 A 的实例并把 A 压入栈中。这里所说的 A 所需要的任务栈是什么意思呢?其实 Activity 是可以指定自己想要的任务栈的名字的,通过一个参数:TaskAffinity,默认情况下,所有的 Activity 所需要的任务栈的名字为应用的包名。

如果任务栈 S1 中的情况为 ABC,这个时候 Activity D 以 singleTask 模式请求启动,它需要的任务栈为 S2,由于 S2 和 D 的实例均不存在,所以系统就会先创建任务栈 S2,然后在创建 D 的实例并将其入栈到 S2

如果上面 D 所需的任务栈为 S1,那么因为 S1 已经存在,所以系统直接创建 D 的实例并且入栈到 S1。

如果 D 所需的任务栈为 S1,但是 S1 中的情况为 ADBC,此时 D 不会重新创建,而是把 D 切换到栈顶并调用 onNewIntent 方法。那 B 和 C 怎么办? 它们会全部出栈,相当于 clearTop 效果。

singleInstance

singleInstance 是单实例模式。这种模式是 singleTask 的加强版,它除了具有 singleTask 的所有特性外,还加强了一点,那就是此种模式的 Activity 只能单独位于一个任务栈中。

比如 Activity A 是 singleInstance 模式,当 A 启动后,系统会创建一个新的任务栈,然后 A 独自在这个新的任务栈中,由于栈内复用的特性,后续的请求均不会创建新的 Activity,除非这个栈被销毁了。

总结

Activity 的四种启动模式就是这样,除了 singleTask 稍微有点复杂,其它都很好理解。有的时候会出现多个任务栈的情况,比如现在有两个任务栈(如下图),前台的任务栈情况为 Activity1 和 Activity2, 而后台任务栈的情况为 ActivityX 和 ActivityY,假设 XY 的启动模式均为 singleTAsk。现在启动Y, 那么整个后台任务栈都被切换到前台,这时候的后退列表变为 12XY。当按返回键的时候,Activity 会依次出栈。

bVu75N?w=550&h=309

参考

如果我的文章对您有帮助,不妨点个赞鼓励一下(^_^)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值