Jetpack学习之Lifecycles(二)

一、前言

  1. Jetpack学习之DataBinding(一)

通过上篇文章的学习,介绍了DataBinding的简单使用,今天来学习记录下Jetpack架构分类下的Lifecycles

Jetpack核心组件 Lifecycles、LiveData、ViewModel、Room也被称为AAC。

二、Lifecycles

1.Lifecycles简单分析

Lifecycles根据网上官方解释,是一个可感知Activity生命周期的组件,这里也不从网上copy图了,网上一大堆,这里还是从简单的代码来理解。

public class MainActivity extends AppCompatActivity {

    ActivityMainBinding mBinding;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mBinding = ActivityMainBinding.inflate(getLayoutInflater());
        setContentView(mBinding.getRoot());

        getLifecycle().addObserver(new LifecycleEventObserver() {
            @Override
            public void onStateChanged(@NonNull LifecycleOwner source, @NonNull Lifecycle.Event event) {
                Log.i("lifecycle_event->", event.name());
            }
        });
    }
}

通过 getLifecycle() 获取生命感知组件,再调用 addObserver 添加监听,运行打印如下:
在这里插入图片描述
然后按返回键退出:依次打印了Activity其它的生命周期方法,这里不帖图了,整个过程完整的打印如下:

2021-11-14 10:57:39.879 2297-2297/com.architect.mvvmtest I/lifecycle_event->: ON_CREATE
2021-11-14 10:57:39.880 2297-2297/com.architect.mvvmtest I/lifecycle_event->: ON_START
2021-11-14 10:57:39.881 2297-2297/com.architect.mvvmtest I/lifecycle_event->: ON_RESUME
2021-11-14 11:03:01.701 2297-2297/com.architect.mvvmtest I/lifecycle_event->: ON_PAUSE
2021-11-14 11:03:01.861 2297-2297/com.architect.mvvmtest I/lifecycle_event->: ON_STOP
2021-11-14 11:03:01.861 2297-2297/com.architect.mvvmtest I/lifecycle_event->: ON_DESTROY

通过上面简单几行代码,就实现了监听当前Activity的生命周期变化,上面代码是如何实现的,简单通过源码分析下(ps 这里贴几张源码的图,简单看下过程):
在这里插入图片描述
通过 getLifecycle 获取生命感知组件,点击鼠标可以进入源码查看,可以看到文档说明,这个方法返回的是 LifecycleRegistry 实例。
在这里插入图片描述
可以看到在 ComponentActivity 中声明创建了 mLifecycleRegistry 对象。getLifecycle返回的就是这个对象。

这里要说明下,例子中使用的MainActivity继承AppCompatActivity,通过鼠标点击进入查看父类,会发现父类中有 ComponentActivity类,说明MainActivity也是它的子类,所以可以使用父类中公开的方法。

这里可以自己查看下 LifecycleRegistry 类的源码,LifecycleRegistry 继承 Lifecycle ,Lifecycle是一个抽象类,里面有添加、移除监听的方法,定义了代表生命周期事件 枚举类Event

    public enum Event {
        /**
         * Constant for onCreate event of the {@link LifecycleOwner}.
         */
        ON_CREATE,
        /**
         * Constant for onStart event of the {@link LifecycleOwner}.
         */
        ON_START,
        /**
         * Constant for onResume event of the {@link LifecycleOwner}.
         */
        ON_RESUME,
        /**
         * Constant for onPause event of the {@link LifecycleOwner}.
         */
        ON_PAUSE,
        /**
         * Constant for onStop event of the {@link LifecycleOwner}.
         */
        ON_STOP,
        /**
         * Constant for onDestroy event of the {@link LifecycleOwner}.
         */
        ON_DESTROY,
        /**
         * An {@link Event Event} constant that can be used to match all events.
         */
        ON_ANY
    }

从上述分析看下,getLifecycle()方法获取 LifecycleRegistry 对象,添加回调监听,那这些生命周期回调是如何调用的呢?带着这个疑问,结合源码简单分析下。

在ComponentActivity中的onCreate方法中,会发现,会创建一个空的fragment依附到当前Activity来监听生命周期的变化。如图:
在这里插入图片描述
再看下ReportFragment各生命周期方法中的代码:
在这里插入图片描述
其实在源码中有对 SDK_INT 版本做了判断,29及以上和低版本的处理方式有些差别,这个也不去过多分析了。

从上述代码中可以看出,在ReportFragment各个生命周期中都有调用 dispatch 分发的方法,最终还是会调用到LifecycleRegistry中的dispatchEvent方法,这中间有些细节,这里不去分析了:

在这里插入图片描述
简单总结下调用流程,在ComponentActivity中会创建ReportFragment关联到当前Activity的生命周期方法,在ReportFragment各生命周期方法中分发 生命周期 事件。

这里再通过断点验证下:
在这里插入图片描述

2.总结

在Activity可以通过getLifecycle().addObserver()的方法来监听各生命周期事件,原理就是一个空界面ReportFragment依附在Activity上面,ReportFragment会在自己的生命周期变化时,调用dispatch方法来通知各监听者。

上述例子只是简单分析了下原理,并没有体现出强大这处,这个要结合LiveData和ViewModel来使用。

后记:
这里也是自己理解学习记录,有些地方理解的不对的地方希望大家在评论中指出,后续会接着写JetPack相关的工具使用。谢谢~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值