Activity 有四种启动模式,分别为 standard、singleTop、singleTask 和 singleInstance。
启动模式可以在项目的清单文件中的 activity 标签下填写 android:launchMode 属性进行配置。
1. standard
standard 应该是我们打交道最多的一种启动模式了,它是 Activity 的默认启动模式,在不进行指定启动模式情况下,所有 Activity 都是以这种模式启动的。
因此,它的特性我们也最熟悉。每次启动一个 standard 模式的 Activity,系统就会新建一个 Activity 实例,并且无论返回栈中是否已有该 Activity 实例,系统都会将刚新创建的 Activity 实例处于返回栈栈顶。
2. singleTop
很显然,standard 模式有它设计不合理的地方,为什么此时 Activity 已经在栈顶了,还会重复创建此 Activity 实例呢?
singleTop 模式会在一定程度上解决这样的问题。
如果 Activity 是以 singleTop 模式启动的,那么在创建此 Activity 实例之前,会先查看栈顶 Activity 是否是此 Activity,如果是,则直接调用栈顶 Activity ,并不再新建 Activity 实例。如果不是,则新建该 Activity 实例。
3. singleTask
前文说 singleTop 模式会在一定程度上解决重复创建活动的问题 的一定程度上 是指如果当前需要新建一个 MainActivity,并且是以 singleTop 模式启动的。那么系统就要先查看栈顶 Activity 是不是 MainActivity,如果发现不是,那么系统新建一个 MainActivity 并将其处于栈顶。
看着没问题,那如果当前返回栈中已有一个 MainActivity,但并不是处于栈顶位置。然后系统又新建了一个 MainActivity 实例,那此时栈中就有两个 MainActivity 实例,还是没有完全解决创建重复活动的问题。
这时,该 singleTask 登场了!
如果使用 singleTask 作为 Activity 的启动模式,那么在每次启动该 Activity 时,系统就会在返回栈中检查是否存在该 Activity 的实例,如果有则直接使用该 Activity 实例,并将在其之上的 Activity 实例纷纷请出栈。如果没有,则新建 Activity 实例。
这样,就能保证返回栈中只有一个 Activity 实例了。
4. singleInstance
singleInstance 是四种启动模式中最特殊的一个了。如果 Activity 被指定为 singleInstance 模式启动,那么系统会启用一个新的返回栈来管理这个活动。这样做的意义在于可以将此 Activity 与其它程序共享。
详细流程:
加入我目前所在活动为 OneActivity,然后以 singleInstance 模式启动 TwoActivity,之后再以默认 standard 模式启动 ThreeActivity。
之后在 ThreeActivity 中点击 Back 键返回,顺序为 ThreeActivity → OneActivity → TwoActivity。因为TwoActivity 是以 singleInstance 模式启动的,所以它不与 OneActivity 和 ThreeActivity 处于一个返回栈中。所以返回时要先将当前返回栈中的活动都返回出栈之后,才会显示另一个栈中的活动。
由于 singleInstance 模式的特殊及复杂性,所以它很少会被用。
参考
郭霖《第一行代码》
网友评论