Android12四大组件之Activity生命周期变化详解
作者:fundroid_方卓 发布时间:2022-05-04 15:47:57
前言
Android12 有很多令人惊喜的变化,比如基于 Material You 的全新 UI,基于 SplashScreen 的应用启动画面以及更安全的隐私设置等等,此外也有一些需要开发者注意的行为变化,比如这里介绍的 Activity 的 Lifecycle 上的变化
点击返回键Activity不在onDestroy
Android 12 以前,当我们处于 Root Activity 时,点击返回键时,应用返回桌面, Activity 执行 onDestroy,程序结束。 Android 12 起同样场景下 Activity 只会 onStop,不再执行 onDestroy。
通过下面代码进行验证:
class LifecycleLogObserver : LifecycleEventObserver {
override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) {
Log.d(source::class.java.simpleName, event.name)
}
}
class SampleActivity: AppCompatActivity() {
init {
lifecycle.addObserver(LifecycleLogObserver())
}
}
启动 Activity,按下返回键后,重新打开 App。首先 Android12 之前的设备,Log 如下:
// 初次启动
D/SampleActivity: ON_CREATE
D/SampleActivity: ON_START
D/SampleActivity: ON_RESUME
// 返回桌面
D/SampleActivity: ON_PAUSE
D/SampleActivity: ON_STOP
D/SampleActivity: ON_DESTROY
// 再次启动
D/SampleActivity: ON_CREATE
D/SampleActivity: ON_START
D/SampleActivity: ON_RESUME
再开 Android12 之后的设备:
// 初次启动
D/SampleActivity: ON_CREATE
D/SampleActivity: ON_START
D/SampleActivity: ON_RESUME
// 返回桌面
D/SampleActivity: ON_PAUSE
D/SampleActivity: ON_STOP
// 再次启动
D/SampleActivity: ON_START
D/SampleActivity: ON_RESUME
我们知道 ViewModel 的销毁在 onDestroy 中,这样改动后 ViewModel 中的状态可以保存,再次启动后可以直接使用。对于使用者来说直接感受就是冷启动变为了热启动,启动速度更快。
注意:所谓 Root Activity 就是我们在 AndroidManifest 中配置了 IntentFilter 为 ACTION_MAIN 和 CATEGORY_LAUNCHER 的入口 Activity,其他 Activity 点击返回键后行为不变,依然会 onDestroy
重新onBackPressed时的注意点
如果你的应用在 Android12 中没有上述变化,那很有可能是你重写了 onBackPressed 并手动调用了 finish(),为了在行为上符合 Android12 的预期,需要修改如下:
class SampleActivity : AppCompatActivity() {
private var flag = true
override fun onBackPressed() {
if (flag) {
flag = false
TODO("do sth business")
return
}
//Don't call finish()
super.onBackPressed()
}
}
当然,官方已不再推荐重写 onBackPressed 了,更好的做法使用 AndroidX 的 OnBackPressedCallback 重写你的实现,它会自动适配 Android12 的变化。
class SampleActivity : AppCompatActivity() {
private val onBackPressedCallback: OnBackPressedCallback =
object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
TODO("do sth business")
//处理自定义业务后,后续返回键交回系统处理
onBackPressedCallback.isEnabled = false
}
}
}
来源:https://blog.csdn.net/vitaviva/article/details/125074388


猜你喜欢
- mybatis多层级collection嵌套json结构第一步查询第一层查询,将第一层的id传递到第二层当条件查询
- 常量池中各数据项类型详解(续)(8) CONSTANT_Class_info常量池中的一个CONSTANT_Class_info,
- 一、表创建一、表创建//创建一个空表DataTable dt = new DataTable();//创建一个名为"Table_N
- vs2005中总是保留最近打开的项目和文件的记录,甚至是以删除的它也不删,-_-!下面介绍几种删除的方法:第一种:建立一个bat文件,以后双
- dynamic关键字和动态语言运行时(DLR)是.Net 4.0中新增的功能。什么是"动态"?编程语言有时可以划分为静态
- 本文实例讲述了Android实现为Notification加上一个进度条的方法。分享给大家供大家参考,具体如下:package com.no
- 在Android开发中我们经常会用到网络连接功能与服务器进行数据的交互,为此Android的SDK提供了Apache的HttpClient来
- 1.添加加载更多布局1_初始化和隐藏代码在RefreshListView构造方法中调用private void initFooterView
- 一.组合widget实现1.android和flutter自定义控件对比Android中,一般会继承View或已经存在的某个控件,然后覆盖d
- 一、什么是递归方法调用自己的行为就是递归,递归必须要有终止条件,不然它会无限递归。1.先来看一下一个递归的例子此程序的Fact方法从大到小地
- 一、原理1、不变模式(不可变对象)在并行软件开发过程中,同步操作似乎是必不可少的。当多线程对同一个对象进行读写操作时,为了保证对象数据的一致
- 集成配置步骤步骤1:加入 Maven 相关依赖<!-- 指定 Springboot 版本 --><parent> &
- 本文实例讲述了C#中图片、二进制与字符串的相互转换方法。分享给大家供大家参考,具体如下:protected void Button1_Cli
- 为什么要用synchronized相信大家对于这个问题一定都有自己的答案,这里我还是要啰嗦一下,我们来看下面这段车站售票的代码:/** *
- 1.连接池在实际开发中都会使用连接池因为它可以减少我们获取连接所消耗的时间连接池就是用于存储连接的一个容器,容器其实就是一个集合对象,该集合
- Android 实现tab视图有2种方法,一种是在布局页面中定义<tabhost>标签,另一种就是继承tabactivity.但
- 程序是这样的:static void Main(string[] args){ SmtpClient c
- 在 Java 中,所有的异常都有一个共同的祖先 Throwable(可抛出)。Throwable 指定代码中可用异常传播机制通过 Java
- 前言本文主要介绍其具体的实现思路(视频仅有代码输入,并无过程介绍等),同时,在原本实现的基础上,进行了多处修改和优化,具体参见下面的内容。优
- 目录synchronized 实现原理适应性自旋(Adaptive Spinning)锁升级Java 对象头偏向锁(Biased Locki