0x1、Lifecycle简介
本节继续学穿Jetpack,带来第二个组件 Lifecycle
,用于帮助开发者管理Activity、Fragment的生命周期,它可是LiveData、ViewModel等组件的基石。
日常开发中经常会遇到这些问题:
- 需要在Activity、Fragment的生命周期回调中执行特定操作,否则会引起
程序错误
或内存泄露
,比如:无限循环的属性动画忘记在onDestory中取消,Eventbus忘记在onDestory中unregister等。不要想着自己小心注意就好,在多人协作的场景下,特别是在多人协作的场景下; - 一种常规解法:写个
基类
,重写生命周期回调方法,把操作代码都堆到各个方法中,以此规避认为的疏忽。可以,但是也导致了基类臃肿不堪,不好维护,而且有些子类被迫继承
一堆不需要的操作; 可能存在不符预期的生命周期情况
,比如onCreate()里发起一个异步回调,但因为回调比较耗时,等到回调时已经处于onStop()状态了,回调里的操作可能没意义了,所以需要拿到当前所处的生命周期状态。- 一种常规解法:
额外定义一个哨岗值
,在生命周期回调方法中去修改这个值,异步回调根据这个值执行相应操作。
Lifecycle 的出现,就是帮助开发者解决上述问题:
将组件的生命周期状态信息隔离出来统一管理,并允许其他对象进行观察。
0x2、Lifecycle使用
Tips:部分内容搬运自官方文档:《使用生命周期感知型组件处理生命周期》
① 依赖引入
// 非Androidx
implementation "android.arch.lifecycle:extensions:1.1.1"
// Androidx
implementation 'androidx.appcompat:appcompat:1.4.1'
只需依赖一个appcompat即可,打开左侧 External Libraries 可以看到和lifecycle相关的库:
键入:gradlew :app:dependencies 查看依赖树,可以看到core、activity等模块都依赖lifecycle了~
一般无需额外依赖配置即可使用,当然如果对库版本有要求、或是使用特殊情况下的扩展类,可以单独依赖,如:
// 注解处理器
annotationProcessor "androidx.lifecycle:lifecycle-compiler:2.3.1"
// Java 8支持的 DefaultLifecycleObserver
implementation "androidx.lifecycle:lifecycle-common-java8:2.3.1"
// 实现Service的LifecycleOwner
implementation "androidx.lifecycle:lifecycle-service:2.3.1"
// ProcessLifecycleOwner给整个app进程提供一个lifecycle
implementation "androidx.lifecycle:lifecycle-process:2.3.1"
// ReactiveStreams support for LiveData
implementation "androidx.lifecycle:lifecycle-reactivestreams:2.3.1"
关于库的版本号及其依赖的库,可到 MVNRepository 输入包名自行查询:
Tips:如果单纯只想用Lifecycle,只需引入lifecycle-runtime,不过它一般是跟LiveData、ViewModel一起使用的。
② 基本使用
- 自定义观察者 → 观察者实现
DefaultLifecycleObserver
接口并重写相应方法来监控组件生命周期; - 组件添加观察者 →
getLifecycle()
获取Lifecycle实例,调用addObserve()
Tips:旧版的写法 → 观察者实现 LifecycleObserver,通过 OnLifecycleEvent注解 的方式添加对应生命周期的方法,但这种写法已经废弃了,文档注释中建议使用 DefaultLifecycleObserver 或者 LifecycleEventObserver。
使用代码示例如下:
运行结果如下:
Activity中不需要重写一堆生命周期回调方法,只需添加一个观察者,从 继承
变成了 组合
,代码精简效果不是一星半点。
你可能不知道这有多妙,容杰哥娓娓道来,想想:
现在有十个库,都要在生命周期里执行相关操作,按照原先的写法,得重写Activity生命周期回调,补上这是个库对应的代码调用,恭喜,这个类一下子就变得 又长又臭 了。
再加下难度?
库对应的生命周期回调都不一致,比如:A库只关注onCreate()和onDestory(),B库只关注onDestory(),C库只关注onStop等。当要去掉、增加、修改某一个库时,你可得 打醒十二分精神,毕竟一个不小心改错了,就得在这种低级BUG上耗费宝贵的时间。
那换成Lifecycle这种方案呢?它帮我们做到了:关注点分离
每个库定义一个观察者,在其中按需重写生命周期回调,Activity无脑addObserve()即可。将原本又臭又长的代码 隔离 到单独类中。改的话直接改对应类,无需担心影响到其他库,增删改库无压力,妙啊!
③ Event(事件) & State(状态)
官方文档中有这样一个图:
有些读者看了可能有点懵逼,把中间的Event大写改成小写你就懂了,比如ON_CREATE → onCreate(),就是 生命周期回调,而State就是所处的 生命周期状态,有时我们需要获取生命周期组件当前的状态,就是通过这个判定的,两者配合使用。
解读:
- Lifecycle.State.CREATED → 回调onCreate()、onStop()后;
- Lifecycle.State.STARTED → 回调onStart()、onPause()后;
- Lifecycle.State.RESUMED → 回调onResume()后;
- Lifecycle.State.DESTROYED → 回调onDestroy()后;
Tips:判断生命周期状态示例:if (lifecycleOwner.lifecycle.currentState.isAtLeast(Lifecycle.State.STARTED)
④ 自定义 LifecycleOwner
appcompat 26.1.0 及更高版本的 Fragment、Activity 默认实现了 LifecycleOwner,一般是无需自定义的,当然想自己实现一个具有生命周期感知的组件,也开始可以的。先知道下三个核心类:
LifecycleOwner
→ 具有Lifecycle;LifecycleObserver
→ 监听生命周期事件;LifecycleRegistry
→ 转发生命周期事件,自定义LifecycleOwner才用得到;
为了应付写例子没啥大用,直接以 Lifecycle可选库 lifecycle-process
为例讲解一波~
它为整个App进程提供一个 ProcessLifecycleOwner,通过简单几行代码,即可监听App前后台切换。
依赖引入:
implementation "androidx.lifecycle:lifecycle-process:2.4.0"
测试代码如下,显示Application类:
然后是调用的Activity:
运行下看下效果:
简单易用没毛病,轻松监听应用前后台切换,接着扒下这个库是如何实现的:
可很简单,就四个文件,先是初始化类 ProcessLifecycleInitializer
:
利用ContentProvider拿到App的Context,执行初始化操作,这里用到另一个组件StartUp,后续会介绍~
跟下 LifecycleDispatcher → init()
registerActivityLifecycleCallbacks()
是Application提供的一个方法,可以监控App内所有Activity的生命周期。只重写了 onActivityCreated()
,通过 ReportFragment
来Hook宿主的生命周期。
接着往下看 ProcessLifecycleOwner → init() → attach()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dbtMSXer-1653642216077)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/c2eeb1a999b14941b50c22ec5f118ebf~tplv-k3u1fbpfcp-zoom-in-crop-mark:1956:0:0:0.image)]
看不太懂,貌似是为了保证onStart()和onResume()的顺序相对正确,跟下回调方法:
再跟下 mDelayedPauseRunnable
:
延时700ms,然后去验证是否处于后台,然后 LifecycleRegistry 转发生命周期事件,完。简单点就是封装了 Application.ActivityLifecycleCallbacks,并提供了一个全局的 LifecycleOwner。
文末
我总结了一些Android核心知识点,以及一些最新的大厂面试题、知识脑图和视频资料解析。
需要的小伙伴私信【学习】我免费分享给你,以后的路也希望我们能一起走下去。(谢谢大家一直以来的支持,需要的自己领取)
直接点击文末小卡片可以领取哦!
Android学习PDF+架构视频+面试文档+源码笔记
部分资料一览:
- 330页PDF Android学习核心笔记(内含8大板块)
- Android学习的系统对应视频
- Android进阶的系统对应学习资料
- Android BAT大厂面试题(有解析)
领取地址:
点击下方卡片免费领取