【Jetpack】学穿:Lifecycle → 生命周期 (使用篇)

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大厂面试题(有解析)

领取地址:

点击下方卡片免费领取

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值