Android JetPack深入分析Lifecycle源码

news/2024/10/21 6:04:21/

文章目录

    • 前言
      • 关键类介绍
        • Lifecycle
        • LifecycleObserver
        • LifecycleOwner
        • LifecycleRegistry
        • 关键类UML类图关系
    • 生命周期注册
    • 生命周期分发
    • 总结
    • 结语

前言

关键类介绍

Lifecycle

定义:用于存储有关组件(如 activity 或 fragment)的生命周期状态的信息,并允许其他对象观察此状态。

  • 它是一个抽象类,具体实现类为LifecycleRegistry
  • 内部提供了addObserver(LifecycleObserver observer) 添加观察者removeObserver(LifecycleObserver observer)移除观察者方法;
  • 内部封装了State【状态】Event【事件】枚举类,以及一系列事件状态处理方法;
   @MainThread@NonNullpublic abstract State getCurrentState();public enum Event {ON_CREATE,ON_START,ON_RESUME,ON_PAUSE,ON_STOP,ON_DESTROY,ON_ANY;@Nullablepublic static Event downFrom(@NonNull State state) {switch (state) {case CREATED:return ON_DESTROY;case STARTED:return ON_STOP;case RESUMED:return ON_PAUSE;default:return null;}}@Nullablepublic static Event downTo(@NonNull State state) {switch (state) {case DESTROYED:return ON_DESTROY;case CREATED:return ON_STOP;case STARTED:return ON_PAUSE;default:return null;}}@Nullablepublic static Event upFrom(@NonNull State state) {switch (state) {case INITIALIZED:return ON_CREATE;case CREATED:return ON_START;case STARTED:return ON_RESUME;default:return null;}}@Nullablepublic static Event upTo(@NonNull State state) {switch (state) {case CREATED:return ON_CREATE;case STARTED:return ON_START;case RESUMED:return ON_RESUME;default:return null;}}@NonNullpublic State getTargetState() {switch (this) {case ON_CREATE:case ON_STOP:return State.CREATED;case ON_START:case ON_PAUSE:return State.STARTED;case ON_RESUME:return State.RESUMED;case ON_DESTROY:return State.DESTROYED;case ON_ANY:break;}throw new IllegalArgumentException(this + " has no target state");}}@SuppressWarnings("WeakerAccess")public enum State {DESTROYED,INITIALIZED,CREATED,STARTED,RESUMED;//传入的state是否存在public boolean isAtLeast(@NonNull State state) {return compareTo(state) >= 0;}}

构成Activity生命周期的状态和事件,其对应关系图如下:
状态和事件对应关系图
由上图我们可以很容易理解其中定义的方法:

	//根据传入的state获取逆序【生命周期结束方向】需要向下移动的事件public static Event downFrom(@NonNull State state) {switch (state) {case CREATED:return ON_DESTROY;case STARTED:return ON_STOP;case RESUMED:return ON_PAUSE;default:return null;}}//根据传入的state获取逆序【生命周期结束方向】触发state的事件public static Event downTo(@NonNull State state) {switch (state) {case DESTROYED:return ON_DESTROY;case CREATED:return ON_STOP;case STARTED:return ON_PAUSE;default:return null;}}//根据传入的state获取正序【生命周期上升方向】需要向下移动的事件public static Event upFrom(@NonNull State state) {switch (state) {case INITIALIZED:return ON_CREATE;case CREATED:return ON_START;case STARTED:return ON_RESUME;default:return null;}}//根据传入的state获取正序【生命周期上升方向】触发state的事件public static Event upTo(@NonNull State state) {switch (state) {case CREATED:return ON_CREATE;case STARTED:return ON_START;case RESUMED:return ON_RESUME;default:return null;}}

LifecycleObserver

生命周期观察者,用来监听Activity生命周期变化;其子类常用的有DefaultLifecycleObserverLifecycleEventObserver;

public interface LifecycleEventObserver extends LifecycleObserver {//生命周期变化回调void onStateChanged(@NonNull LifecycleOwner source, @NonNull Lifecycle.Event event);
}

LifecycleOwner

具有生命周期的类,对应被观察者,提供获取getLifecycle()方法ComponentActivity类实现该接口;

public interface LifecycleOwner {@NonNullLifecycle getLifecycle();
}

LifecycleRegistry

Lifecycle类的具体实现类,于ComponentActivity内部创建,其内部持有LifecycleOwner引用,通过维护mState【当前状态】mObserverMap【存储观察者对象】等变量实现生命周期同步以及分发;

关键类UML类图关系

Lifecycle UML类图
小结: LifecycleOwner作为被观察者,其被ComponentActivity实现,同时ComponentActivity内部持有LifecycleRegistry对象,其提供添加、移除观察者LifecycleObserver方法,而从持有注册的观察者集合,一旦Activity生命周期变化时,LifecycleOwner便会触发LifecycleRegistry对象中的方法,并由LifecycleRegistry将事件分发给注册的观察者们;

生命周期注册

生命周期分发

总结

结语


http://www.ppmy.cn/news/705996.html

相关文章

找不到战网服务器ip地址,《冰封王座》战网服务器IP地址大全

战网服务器IP地址大全及综合注册表 唯一战网(永远免费) 218.104.78.43 (或oursky.9966.org) 新非常战网(原好像叫match) 218.22.211.186 KCG战网(速度不错) 211.155.18.96 游侠战网(youxia) 202.101.165.185 2T星际战网 61.132.88.45 夏门大学战网 210.34.5.5 YY战网(Yunnan) 6…

暴雪战网服务器维护时间,炉石传说停机维护30小时 暴雪与网易做了个艰难的决定...

原标题:炉石传说停机维护30小时 暴雪与网易做了个艰难的决定 1月20日,随着补偿包陆续发放到相关玩家账号,《炉石传说》的运营事故得到了初步解决。从17日凌晨到18日晚间,在超过30个小时的维护时间里,暴雪和网易做了个“艰难”的决定:将所有游戏数据回档至1月14日15:20,并…

暴雪战网服务器维护时间,暴雪战网登录不上去2021

暴雪战网登录不上去的解决方法是:首先需要查看自己的电脑网络是否正常,如果只是网络的问题,需要先使电脑联网才行,如果网络没有问题的话,要查看当前的战网公告消息,是不是处于维护状态,导致客户…

Python Dataframe-B更新Dataframe-A

假设现在有两个dataframe,分别是A和B,它们有相同的列text和label。现在想使用B的label来更新A的label,基于它们共同的text。 数据示例 import pandas as pd# Sample DataFrames A and B data_A {text: [text1, text2, text3, text4], labe…

《基于AidLux的自动驾驶智能预警应用方案》

YOLOP模型转ONNX ONNX是开放式神经网络(Open Neural Network Exchange)的简称,ONNX的规范及代码主要由微软,亚马逊,Facebook和IBM等公司共同开发,以开放源代码的方式托管在Github上。目前官方支持加载ONNX模型的框架有&#xff1…

IOS如何安装ipa文件

https://www.i4.cn/pro_ios.html#jiaocheng 用电脑下载 爱思助手PC端 然后电脑连接 苹果手机, 用 安装的 爱思助手PC端 软件 安装 “爱思助手移动端” 下载并安装 “爱思助手PC端” ,打开爱思助手PC端 用数据线连接设备到电脑,连接成功后&am…

直接下载ipa包

itms-services://?actiondownload-manifest&urlxxx.plist

查看ipa内容

经过Xcode编译生成的ipa文件实际上就是一个zip文件。我们把ipa文件的后缀名改成“zip”,然后双击即可解压打开。解压后的程序在Payload目录下,是一个“app”后缀的文件夹。在文件上单击右键,选择“显示包内容(Show Package Conten…