Android Jetpack架构组件之Lifecycle源码分析

本文深入探讨了Android Jetpack架构组件中的Lifecycle,分析了如何添加观察者、何时通知观察者以及源码实现的细节,旨在帮助读者理解Lifecycle的工作原理。
摘要由CSDN通过智能技术生成

您总说梦想遥不可及,可您却从不早睡。也不早起——《狼道》

目录

一、前言

二、源码分析

(1)添加观察者

(2)通知观察者

(3)何时通知

三、总结

四、内容推荐

五、项目参考

一、前言

——回顾了一下之前学习过的东西并打算把这些东西整理成文章,加深映像和理解,同时也传达自己的见解供大家参考,若存在错误或不足的地方,希望您能指出。
本篇续《Android Jetpack架构组件之Lifecycle入门》文章之后,上一篇介绍了Lifecycle。由于篇幅太长拆成两篇。这篇主要是分析Lifecycle源码,理解其实现原理。回顾一下Lifecycle结构图


LifeCycle相关链接——官方文档接口文档相关依赖文档

二、源码分析

——通过上面的使用过程,大体理解为创建一个观察者,当组件生命周期发生变化时,通知观察者有LifeCycle注解的方法做出响应。那么实现原理分成两部分来分析

(1)怎么通知观察者响应生命周期的变化(怎么通知)

(2)生命周期更改的时候是如何通知观察者的(何时通知)

(1)添加观察者

1.使用入口**getLifecycle().addObserver()** (不同版本Lifecycle源码各有差异,这边引用的是'androidx.appcompat:appcompat:1.1.0)

   /*
    * 通过查看源码得出MainActivity继承了AppCompatActivity,AppCompatActivity继承了FragmentActivity ,FragmentActivity 继ComponentActivity
    * 并实现了LifecycleOwner接口的getLifecycle()方法 ,返回生命周期的提供者 ,而FragmentActivity重写了ComponentActivity的getLifecycle()方法
    * 所以这边调用的是FragmentActivity里面的getLifecycle()方法得到LifecycleRegistry实例
    */
 final LifecycleRegistry mFragmentLifecycleRegistry = new LifecycleRegistry(this);
 public Lifecycle getLifecycle() {
     //这里返回LifecycleRegistry对象
     return mFragmentLifecycleRegistry;
 }

2.FragmentActivity里面创建了LifecycleRegistry 实例,下面看下LifecycleRegistry构造源码

    // 给生命周期的提供者创建一个LifecycleRegistry
    public LifecycleRegistry(@NonNull LifecycleOwner provider) {
        mLifecycleOwner = new WeakReference<>(provider);
        mState = INITIALIZED;
    }

3.LifecycleRegistry继承了Lifecycle抽象类,并重写了addObserver()方法。主要作用是添加一个生命周期的观察者,当生命周期的提供者发生状态改变的时候,通知观察者做出响应

    //保存观察者的自定义列表
    private FastSafeIterableMap<LifecycleObserver, ObserverWithState> mObserverMap =
            new FastSafeIterableMap<>();
    @Override
    public void addObserver(@NonNull LifecycleObserver observer) {
        //设置lifecycle的初始状态 ,State是个生命周期的枚举类型
        State initialState = mState == DESTROYED ? DESTROYED : INITIALIZED;
        //创建ObserverWithState实例,并将LifecycleObserver 转化为LifecycleEventObserver,详情看(4)
        ObserverWithState statefulObserver = new ObserverWithState(observer, initialState);
        //保存生命周期的观察者与ObserverWithState(观察者的生命状态),保存成功返回NULL,否则说明已经保存过,返回ObserverWithState对象
        ObserverWithState previous = mObserverMap.putIfAbsent(observer, statefulObserver);
        //拦截已经保存过的观察者
        if (previous != null) {  
            return;
        }
        //生命周期的提供者被回收则返回不继续执行
        LifecycleOwner lifecycleOwner = mLifecycleOwner.get();
        if (lifecycleOwner == null) {
            return;
        }
        // 判断是否连续添加了观察者 或者 正在处理事件  是返回true
        boolean isReentrance = mAddingObserverCounter != 0 || mHandlingEvent;
        //获取状态 详情看(5)
        State targetState = calculateTargetState(observer);
        //正在添加的观察者数量+1
        mAddingObserverCounter++;
        //如果观察者生命周期状态比前面添加进来的小,说明生命周期发生变化,执行以下步骤
        //比如: onCreate()方法中与onResume()方法中同时调用了 addObserver()方法
        while ((statefulObserver.mState.compareTo(targetState) < 0
                && mObserverMap.contains(observer))) {
            //存储添加进来的观察者状态,详情看(7)
            pushParentState(statefulObserver.mState);
            //分发事件  dispatchEvent详情看(4)  upEvent详情看(8)
            statefulObserver.dispatchEvent(lifecycleOwner, upEvent(statefulObserver.mState));
            //移除最后一个添加进去的观察者,详情看(7)
            popParentState();
            //获取状态 详情看(5)
            targetState = calculateTargetState(observer);
        }
        // 当isReentrance为false时 进行同步
        if (!isReentrance) {
            // we do sync only on the top level.
            sync();
        }
        //添加完成时正在处理的观察者数量减一
        mAddingObserverCounter--;
    }

4.ObserverWithState主要是将LifecycleObserver 转化为LifecycleEventObserver

     //将LifecycleObserver 转化为LifecycleEventObserver 
    static class ObserverWithState {
        State mState;
        LifecycleEventObserver mLifecycleObserver;
         //将LifecycleObserver 转化为LifecycleEventObserver 
        ObserverWithState(LifecycleObserver observer, State initialState) {
            //lifecycleEventObserver将LifecycleObserver 转化成LifecycleEventObserver 
            mLifecycleObserver = Lifecycling.lifecycleEventObserver(observer);
            mState = initialState;
        }
        //将生命周期的提供者与Event 
        void dispatchEvent(LifecycleOwner owner, Event event) {
            //获取生命周期状态
            State newState = getStateAfter(event);
            //对比两个状态
            mState = min(mState, newState);
            //在发生生命周期状态转换事件时调用 FullLifecycleObserverAdapter实现了LifecycleEventObserver接口的该方法
            mLifecycleObserver.onStateChanged(owner, event);
            mState = newState;
        }
    }

5.给定观察者对比观察者列表前后的生命周期状态,calculateTargetState返回State最小的生命周期状态

private St
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值