LifeCycle详解

作者: cqj | 来源:发表于2022-07-26 14:07 被阅读0次

    LifeCycle的由来

    解耦是为了解决传统开发某块臃肿,以达到代码量平衡、优雅、易扩展。由于Android大部分开发需要感知组件的生命周期,在对应生命周期中做对应的工作,故原始的做法就是在Activity、Fragment、Service等生命周期回调中增加相应的处理代码,这样导致Activity等组件十分臃肿、难以做扩展。LifeCycle的出现就是在外面实现对这些组件生命周期的感知能力,减少组件中的代码量。

    LifeCycle的使用

    在Activity、Fragment中的使用

    简单新建一个生命周期感知监听器,如下图,该类需要实现LifecycleObserver接口

    图1

    首先在Activity中使用该接口,使用非常简单,只要两行代码就够了

    图2

    下面就是见证奇迹的时候,这样解耦就完成了

    图3

    在Fragment里面实现也非常简单,只用在Fragment里面做Activity同样的工作

    图4

    在Service中的使用

    service中使用非常简单,纯了添加LifeCycleExampleListener监听器外,Service需要继承LifecycleService

    图5

    Application中的使用

    application中使用非常简单,不过LifeCycleExampleListener是添加到全局的ProcessLifecycleOwner里面,这样就可以很方便的感知应用进程在前台还是后台了

    图6

    LifeCycle原理

    现以Application为例,其实里面所有的原理都是一样,ProcessLifecycleOwner.get().getLifecycle().addObserver最终实现类为LifecycleRegistry,addObserver方法如下

    图7

    new ObserverWithState(observer, initialState)->Lifecycling.lifecycleEventObserver(observer),如下图所示,其实就是根据不同Observer的实现方式做适配,当为图1注解时,会动态生成对应的回调方法

    图8

    后面最重要的是生命周期状态改变事件的分发statefulObserver.dispatchEvent(lifecycleOwner, upEvent(statefulObserver.mState)),这样就实现了初始状态的监听,那Application生命周期改变是如何通知这些观察者的呢?主要的实现在ProcessLifecycleOwner类,其中生命周期感应在attachapp.registerActivityLifecycleCallbacks(接口中感应,当有activity启动时执行activityStarted->mRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START)->moveToState(next)->sync()

    图9

    sync()代码如下,经过backwardPass或者forwardPass将生命周期事件传递给观测者,两个方法里面都是通过observer.dispatchEvent(l)实现

    图10

    这样,LifeCycle就实现了动态感知生命周期,且不会造成内存泄漏,因为LifecycleRegistry都是弱引用LifecycleRegistry(包括Activity、Fragment、Service等)

    图11

    相关文章

      网友评论

        本文标题:LifeCycle详解

        本文链接:https://www.haomeiwen.com/subject/ptqoirtx.html