Lifecycle源码分析

Lifecycle

Lifecycle代表生命周期,是一个抽象类,我们经常使用它的子类LifecycleRegistry

Lifecycle提供了三个抽象方法用来添加、删除LifecycleObserver和获取当前Lifecycle状态。

Lifecycle还提供了两个内部枚举EventState

Event

Event代表生命周期发生变化时发送的事件。

State

State代表当前生命周期状态。

LifecycleOwner

LifecycleOwner即生命周期拥有者,是一个接口,只提供了一个获取生命周期的方法。

LifecycleObserver

LifecycleObserver即生命周期的观察者,是一个空接口,里面没有任何方法。

LifecycleEventObserver

LifecycleEventObserver接口提供了onStateChanged方法。当生命周期发生改变会触发onStateChanged方法。

FullLifecycleObserver

FullLifecycleObserver接口提供了与ActivityFragment生命周期同名方法,当触发生命周期,会触发同名方法调用。

GeneratedAdapterObserver

SingleGeneratedAdapterObserver内部包含一个GeneratedAdapter对象。CompositeGeneratedAdaptersObserver内部包含一个GeneratedAdapter数组,当onStateChanged调用时会调用GeneratedAdaptercallMethods方法。

当我们自定义Observer对象时,会根据@OnLifecycleEvent注解生成对应的GeneratedAdapter子类。

ReportFragment

ReportFragment负责在生命周期发生变化时,调用LifecycleEventObserveronStateChanged方法。ComponentActivity通过在onCreate方法中调用ReportFragment的静态方法injectIfNeededInReportFragment进行关联。

ReportFragmentinjectIfNeededIn方法中,会创建一个ReportFragment对象并添加到传入的Activity上。此外,大于29的版本还会调用ActivityregisterActivityLifecycleCallbacks方法。

dispatch()

ReportFragment的生命周期方法调用时,会调用dispatch方法。当sdk小于29不会调用该方法,而是在LifecycleCallbacks的回调方法中调用它的重载方法。

SafeIterableMap

Lifecycle中的所有Observer通过SafeIterableMap来管理的。SafeIterableMap的内部类Entry是一个双向链表。

SafeIterableMap内部定义的几个迭代器。

ListIterator是一个抽象类,它的next方法会调用抽象方法forward。有两个子类AscendingIteratorDescendingIterator,分别实现正序遍历和逆序遍历。

AscendingIterator起始点指向头部,不断向后遍历,DescendingIterator起始点指向尾部,不断向前遍历。

LifecycleRegistry

LifecycleRegistryLifecycle的子类,实现了具体的添加、删除LifecycleObserver和处理Event的操作。ComponentActivity就是直接调用LifecycleRegistry的构造函数创建Lifecycle实例。

构造函数

addObserver()

addObserver方法中会把传入的Observer对象包装成一个ObserverWithState对象,并存入到mObserverMap中。并且获取当前的状态targetStateObserver的状态进行比较,如果Observer的状态小于目标状态则会循环分发事件,直到Observer的状态和targetState一致。比如targetStateSTARTED类,Observer会依次分发ON_CREATEON_STARTON_RESUME事件。

ObserverWithState

ObserverWithStateLifecycleRegistry的内部类。通过调用LifecyclinglifecycleEventObserver方法,将传入的Observer对象转换为LifecycleEventObserver对象。并且添加了一个mState字段来保存Observer的状态。

handleLifecycleEvent()

ReportFragment的dispatch方法会调用LifecycleRegistry的handleLifecycleEvent方法来处理Event。

handleLifecycleEvent方法最终会调用sync方法来同步所有Observer的状态。在sync中,如果当前State小于链表中第一ObserverState,会调用backwardPass方法后向前同步所有ObserverSate。如果当前状态大于最后一个ObserverState,调用forwardPass从前向后遍历Observer同步State

backwardPass()

Lifecycling

lifecycleEventObserver()

lifecycleEventObserver方法负责通过传入LifecycleObserver对象构建一个LifecycleEventObserver对象。

getObserverConstructorType

resolveObserverCallbackType

generatedConstructor()

generatedConstructor方法获取生成的GeneratedAdapter的构造函数。

参考

最后更新于