Android Activity启动模式总结

简介

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

任务栈

当咱们打开一个 APP,第一个出现的 Activity 是咱们指定的默认 Activity,经过这个 Activity 能够跳转到其它 Activity,按返回键能够依次返回到上一个 Activity。这是由于系统把咱们打开的 Activity 放在一个任务栈中。打开第一个 Activity 时,系统会新建一个任务栈,若是继续打开新的 Activity,会建立新 Activity 的实例而且放到任务栈的栈顶,返回时将栈顶的 Activity 出栈,新的栈顶 Activity 将呈如今界面上,过程以下图。android

图片描述

这是默认状况下的任务的入栈出栈,若是指定了不一样的启动模式将会有不一样的表现。ide

standard

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

  • 好比 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,这样就会新建一个任务栈。this

singleTop

singleTop 是栈顶复用模式。在这种模式下,若是新启动的 Activity 已经在任务栈的栈顶了,那么就不会从新建立新的实例,而是调用这个 Activity 的 onPauseonNewIntent 以及 onResume 方法。若是新启动的 Activity 不是位于栈顶,那么仍是会从新建立。spa

  • 好比如今栈内状况是 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 所须要的任务栈的名字为应用的包名。3d

  • 若是任务栈 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 只能单独位于一个任务栈中。code

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

总结

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

图片描述

参考htm

  1. Android 开发艺术探索
  2. http://developer.android.com/...

若是个人文章对您有帮助,不妨点个赞鼓励一下(^_^)

相关文章
相关标签/搜索