文档开发者中心
我的

【原创】Activity的生命周期和启动模式(二)

作者: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'。


点赞
1
收藏
1
回复
分享
举报
浏览481 发布于2019-10-14 08:50未知归属地
全部评论
最多点赞
最新发布
最早发布
暂无评论
暂无评论
写回答
新增插入模板功能
一键使用模板,快速填写内容,轻松发帖~
知道了
  • 为了保障您的信息安全,请勿上传您的敏感个人信息(如您的密码等信息)和您的敏感资产信息(如关键源代码、签名私钥、调试安装包、业务日志等信息),且您需自行承担由此产生的信息泄露等安全风险。
  • 如您发布的内容为转载内容,请注明内容来源。

我要发帖子

了解社区公约,与您携手共创和谐专业的开发者社区。