Android开发 —— Activity启动模式

来源:互联网 发布:sql 更新 编辑:程序博客网 时间:2024/05/23 12:26

-- Activity 为什么需要启动模式

默认情况下,当我们多次启动同一个 Activity 的时候,系统会创建多个实例并把它们一一放入任务栈中,

当我们单击 back 键,会发现这些 Activity 会一一回退。


注:任务栈是一种“后进先出”的栈结构,每按一下 back 键就会有一个 Activity 出栈,直到栈空为止,

当栈中无任何 Activity 的时候,系统就会回收这个任务栈。


-- Activity 有四种启动模式:standard、singleTop、singleTask 和 singleInstance。


(1) standard 标准模式,也是系统的默认模式

每次启动一个 Activity 都会重新创建一个新的实例,不管这个实例是否已经存在。

在这种模式下,谁启动了这个 Activity,那么这个 Activity 就运行在启动它的那个 Activity 所在的栈中。

比如 Activity A 启动了 Activity B(B 是标准模式),那么 B 就会进入到 A 所在的栈中。


(2) singleTop 栈顶复用模式

在这种模式下,如果新 Activity 已经位于任务栈的栈顶,那么此 Activity 不会被重新创建,同时

它的 onNewIntent 方法会被回调,通过此方法的参数我们可以取出当前请求的信息。

需要注意的是,这个 Activity 的 onCreate、onStart 不会被系统调用,因为它并没有发生改变。

如果新 Activity 的实例已存在但不是位于栈顶,那么新 Activity 仍然会重新创建。


举个例子,假设目前栈内的情况为 ABCD,其中 ABCD 为四个 Activity,A 位于栈底,D 位于栈顶,

这个时候假设要再次启动 D,如果 D 的启动模式为 singleTop,那么栈内的情况仍然为 ABCD;

如果 D 的启动模式为 standard,那么由于 D 被重新创建,导致栈内的情况变为 ABCDD。


(3) singleTask 栈内复用模式,这是一种单实例模式。

在这种模式下,只要 Activity 在一个栈中存在,那么多次启动此 Activity 都不会重新创建实例,和 singleTop 一样,系统也会调用其 onNewIntent 。

具体一点,当一个具有 singleTask 模式的 Activity 请求启动后,比如 Activity A,系统首先会寻找是否存在 A 想要的任务栈,

如果不存在,就重新创建一个任务栈,然后创建 A 的实例后把 A 放到栈中。

如果存在 A 所需的任务栈,这时要看 A 是否在栈中有实例存在,如果有实例存在,那么系统就会把 A 调到栈顶并调用它的 onNewIntent 方法,

如果实例不存在,就创建 A 的实例并把 A 压入栈中。


(4) singleInstance:单实例模式

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

换句话说,比如 Activity A 是 singleInstance 模式,当 A 启动后,系统会为它创建一个新的任务栈,然后 A 独自在这个新的任务栈中,由于栈内复用的特性,

后续的请求均不会创建新的 Activity,除非这个独特的任务栈被系统销毁了。


-- 如何给 Activity 指定启动模式

第一种是通过 AndroidManifest 为 Activity 指定启动模式

<activity    android:name="com.ljw.android.SecondActivity"
    android:launchMode="singleTask"/>

第二种是通过在 Intent 中设置标志位来为 Activity 指定启动模式。

Intent intent = new Intent();intent.setClass(MainActivity.this, SecondActivity.class);intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);startActvity(intent);


这两种方式都可以为 Activity 指定启动模式,但是二者还是有区别的。

首先,优先级上,第二种方式的优先级要高于第一种,当两种方式同时存在时,以第二种方式为准;

其次,上述两种方式在限定范围上有所不同,比如,第一种方式无法直接为 Activity 设定 FLAG_ACTIVITY_CLEAR_TOP 标志,

而第二种方式无法为 Activity 指定 singleInstance 模式。

PS1: 参数 taskAffinity (任务相关性),标志了一个 Actvivty 所需要的任务栈道额名字。

默认情况下,所有 Activity 所需的任务栈的名字为应用的包名。

taskAffinity 属性主要和 singleTask 启动模式或者 allowTaskReparenting 属性配对使用,其他情况下没有意义。

(1) 当 taskAffinity 和 singleTask 启动模式配对使用的时候,它是具有该模式的 Activity 的目前任务栈的名字,

待启动的 Activity 会运行在名字和 taskAffinity 相同的任务栈中。

(2) 当 taskAffinity 和 allowTaskReparenting 结合的时候,这种情况比较复杂,会产生特殊的效果。

略。


PS2: 任务栈分为前台任务栈和后台任务栈,后台任务栈中的 Activity 位于暂停状态,用户可以通过切换将后台任务栈再次调到前台。

阅读全文
0 0
原创粉丝点击