作者:HW-LSC
继续前一节:https://developer.huawei.com/consumer/cn/forum/topicview?amp;tid=41599207&page=1&extra=#pid6204
1.2 Activity 的启动模式
1.2.1 Activity 的 LaunchMode
(1)standard:标准模式
系统的默认模式,每次启动一个 Activity 都会重新创建一个新的实例,不管这个实例是否已存在。
值得注意的是,用 ApplicationContext 去启动 standard 模式的 Activity 时会报错,如以下代码:
tv_text.setOnClickListener {
// 点击跳转到 KotlinActivity
val intent = Intent()
intent.setClass(applicationContext, KotlinActivity::class.java)
applicationContext.startActivity(intent)
}
运行会报如下错误:
![]()
这是因为 standard 模式的 Activity 默认会进入启动它的 Activity 所属的任务栈中,但由于非 Activity 类型的 Context(如 ApplicationContext)并无所谓的任务栈,从而报错。
解决上面问题的方法是为待启动 Activity 指定 FLAG_ACTIVITY_NEW_TASK 标记位,这样启动时就会为它创建一个新的任务栈(此时待启动 Activity 是以 singleTask 模式启动的)。
(2)singleTop:栈顶复用模式
此模式下,若新 Activity 已经位于任务栈的栈顶,则此 Activity 不会被重新创建,同时它的 onNewIntent 方法会被回调,通过此方法的参数可以取出当前请求的信息。
值得注意的是,这个 Activity 的 onCreate、onStart 不会被系统调用,因为它并没有发生改变。
(3)singleTask:栈内复用模式
一种单实例模式,此模式下,只要 Activity 在一个栈中存在,那么多次启动此 Activity 都不会重新创建实例,和 singleTop 一样,系统也会回调其 onNewIntent。
(4)singleInstance:单实例模式
一种加强的 singleTask 模式,具有 singleTask 模式的所有特性,并且具有此种模式的 Activity 只能单独地位于一个任务栈中。给 Activity 指定启动模式有两种方法:
1. 通过 AndroidMenifest 为 Activity 指定启动模式
2. 通过在 Intent 中设置标志位为 Activity 指定启动模式。
二者区别在于:
(1) 优先级上,方式2的优先级高于方式1,当两种同时存在时,以方式2为准;
(2) 限定范围不同,比如,方式1无法直接为 Activity 设定 FLAG_ACTIVITY_CLEAR_TOP 标识,而方式2无法为 Activity 指定 singleInstance 模式。
1.2.2 Activity 的 Flags
Activity 的 Flags 有很多,有的标记位可以设定 Activity 的启动模式,有的会影响 Activity 的运行状态等。常用的如下:
FLAG_ACTIVITY_NEW_TASK
其作用是为 Activity 指定 singleTask 启动模式,效果和在 XML 中指定该模式相同。
FLAG_ACTIVITY_SINGLE_TOP
其作用是为 Activity 指定 singleTop 启动模式,效果和在 XML 中指定该模式相同。
FLAG_ACTIVITY_CLEAR_TOP
具有此标记位的 Activity 启动时,在同一个任务栈中所有位于它上面的 Activity 都要出栈。
此模式一般需要和 FLAG_ACTIVITY_NEW_TASK 配合使用,若被启动Activity 的实例已存在,则系统会调用它的 onNewIntent。
FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
具有此标记的 Activity 不会出现在历史 Activity 的列表中(用于某些情况不希望用户通过历史列表回到 Activity 时)。它等同于在 XML 中指定 Activity 的属性 android:excludeFromRecents='true'。





































苏公安网备 32011402010933号