简介
Activity 作为 Android 四大组件之一,几乎是被接触得最多的。Activity 中有个启动模式的概念,分别是 standard
、singleTop
、singleTask
以及 singleinstance
,这篇文章总结一下这四种启动模式的特点。
任务栈
当我们打开一个 APP,第一个出现的 Activity 是我们指定的默认 Activity,通过这个 Activity 可以跳转到其它 Activity,按返回键可以依次返回到上一个 Activity。这是因为系统把我们打开的 Activity 放在一个任务栈中。打开第一个 Activity 时,系统会新建一个任务栈,如果继续打开新的 Activity,会创建新 Activity 的实例并且放到任务栈的栈顶,返回时将栈顶的 Activity 出栈,新的栈顶 Activity 将呈现在界面上,过程如下图。
这是默认情况下的任务的入栈出栈,如果指定了不同的启动模式将会有不同的表现。
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 会依次出栈。
参考
- Android 开发艺术探索
- http://developer.android.com/...
如果我的文章对您有帮助,不妨点个赞鼓励一下(^_^)
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。