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

简介: 本节继续学穿Jetpack,带来第二个组件 Lifecycle,用于帮助开发者管理Activity、Fragment的生命周期,它可是LiveData、ViewModel等组件的基石。

运行结果如下


网络异常,图片无法展示
|


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()


网络异常,图片无法展示
|


看不太懂,貌似是为了保证onStart()和onResume()的顺序相对正确,跟下回调方法:


网络异常,图片无法展示
|


再跟下 mDelayedPauseRunnable


网络异常,图片无法展示
|


延时700ms,然后去验证是否处于后台,然后 LifecycleRegistry 转发生命周期事件,完。简单点就是封装了 Application.ActivityLifecycleCallbacks,并提供了一个全局的 LifecycleOwner


0x3、小结


以上就是Lifecycle基本使用相关的内容,限于篇幅,把Lifecycle背后实现原理 (模板模式+观察者模式) 解读拆分到下一节,感兴趣的可以自行移步到《【Jetpack】学穿:Lifecycle → 生命周期 (原理篇)》,谢谢~


Tips:关于Lifecycle库的改动可以参见:Lifecycle,其他库亦是如此


参考文献:



相关文章
|
Java API Android开发
Jetpack 之 LifeCycle 组件原理解析
1. LifeCycle 是如何监听到 Activity/Fragment 生命周期变化的? 2. LifeCycle 如何将生命周期变化的事件分发给观察者的?
126 0
Jetpack 之 LifeCycle 组件原理解析
|
Java API 开发工具
Jetpack 之 LifeCycle 组件使用详解
LifeCycle 是一个可以感知宿主生命周期变化的组件。常见的宿主包括 Activity/Fragment、Service 和 Application。LifeCycle 会持有宿主的生命周期状态的信息,当宿主生命周期发生变化时,会通知监听宿主的观察者。
122 0
Jetpack 之 LifeCycle 组件使用详解
|
安全 Android开发
Android Jetpack系列之Lifecycle
`Lifecycle`可以让某一个类变成`Activity`、`Fragment`的生命周期观察者类,监听其生命周期的变化并可以做出响应。`Lifecycle`使得代码更有条理性、精简、易于维护。
106 0
|
安全 API 调度
Jetpack 系列(1)—— Lifecycle:生命周期感知型组件的基础
Jetpack 系列(1)—— Lifecycle:生命周期感知型组件的基础
282 0
Jetpack 系列(1)—— Lifecycle:生命周期感知型组件的基础
|
缓存 前端开发 Java
2022 · 让我带你Jetpack架构组件从入门到精通 — Lifecycle
不是标题党!作者会尽力把文章写的更容易理解也更充满深度,本文也随作者的持续学习,持续更新,有问题欢迎在评论区提出~
|
API Android开发 Kotlin
【Jetpack】学穿:Activity Results API(下)
【Jetpack】学穿:Activity Results API
364 0
|
6月前
|
存储 安全 Android开发
构建高效的Android应用:Kotlin与Jetpack的结合
【5月更文挑战第31天】 在移动开发的世界中,Android 平台因其开放性和广泛的用户基础而备受开发者青睐。随着技术的进步和用户需求的不断升级,开发一个高效、流畅且易于维护的 Android 应用变得愈发重要。本文将探讨如何通过结合现代编程语言 Kotlin 和 Android Jetpack 组件来提升 Android 应用的性能和可维护性。我们将深入分析 Kotlin 语言的优势,探索 Jetpack 组件的核心功能,并通过实例演示如何在实际项目中应用这些技术。
|
5月前
|
数据管理 API 数据库
探索Android Jetpack:现代安卓开发的利器
Android Jetpack是谷歌为简化和优化安卓应用开发而推出的一套高级组件库。本文深入探讨了Jetpack的主要构成及其在应用开发中的实际运用,展示了如何通过使用这些工具来提升开发效率和应用性能。
|
4月前
|
存储 数据库 Android开发
🔥Android Jetpack全解析!拥抱Google官方库,让你的开发之旅更加顺畅无阻!🚀
【7月更文挑战第28天】在Android开发中追求高效稳定的路径?Android Jetpack作为Google官方库集合,是你的理想选择。它包含多个独立又协同工作的库,覆盖UI到安全性等多个领域,旨在减少样板代码,提高开发效率与应用质量。Jetpack核心组件如LiveData、ViewModel、Room等简化了数据绑定、状态保存及数据库操作。引入Jetpack只需在`build.gradle`中添加依赖。例如,使用Room进行数据库操作变得异常简单,从定义实体到实现CRUD操作,一切尽在掌握之中。拥抱Jetpack,提升开发效率,构建高质量应用!
70 4