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

Lifecycle提供了三个抽象方法用来添加、删除LifecycleObserver和获取当前Lifecycle状态。
Lifecycle还提供了两个内部枚举Event和State。
Event
Event代表生命周期发生变化时发送的事件。
State
State代表当前生命周期状态。

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

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

LifecycleEventObserver
LifecycleEventObserver接口提供了onStateChanged方法。当生命周期发生改变会触发onStateChanged方法。
FullLifecycleObserver
FullLifecycleObserver接口提供了与Activity和Fragment生命周期同名方法,当触发生命周期,会触发同名方法调用。
GeneratedAdapterObserver
SingleGeneratedAdapterObserver内部包含一个GeneratedAdapter对象。CompositeGeneratedAdaptersObserver内部包含一个GeneratedAdapter数组,当onStateChanged调用时会调用GeneratedAdapter的callMethods方法。
当我们自定义Observer对象时,会根据@OnLifecycleEvent注解生成对应的GeneratedAdapter子类。
ReportFragment
ReportFragment负责在生命周期发生变化时,调用LifecycleEventObserver的onStateChanged方法。ComponentActivity通过在onCreate方法中调用ReportFragment的静态方法injectIfNeededIn与ReportFragment进行关联。
在ReportFragment的injectIfNeededIn方法中,会创建一个ReportFragment对象并添加到传入的Activity上。此外,大于29的版本还会调用Activity的registerActivityLifecycleCallbacks方法。
dispatch()
当ReportFragment的生命周期方法调用时,会调用dispatch方法。当sdk小于29不会调用该方法,而是在LifecycleCallbacks的回调方法中调用它的重载方法。
SafeIterableMap

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

ListIterator是一个抽象类,它的next方法会调用抽象方法forward。有两个子类AscendingIterator和DescendingIterator,分别实现正序遍历和逆序遍历。
AscendingIterator起始点指向头部,不断向后遍历,DescendingIterator起始点指向尾部,不断向前遍历。

LifecycleRegistry
LifecycleRegistry是Lifecycle的子类,实现了具体的添加、删除LifecycleObserver和处理Event的操作。ComponentActivity就是直接调用LifecycleRegistry的构造函数创建Lifecycle实例。
构造函数
addObserver()
addObserver方法中会把传入的Observer对象包装成一个ObserverWithState对象,并存入到mObserverMap中。并且获取当前的状态targetState与Observer的状态进行比较,如果Observer的状态小于目标状态则会循环分发事件,直到Observer的状态和targetState一致。比如targetState是STARTED类,Observer会依次分发ON_CREATE、ON_START和ON_RESUME事件。
ObserverWithState
ObserverWithState是LifecycleRegistry的内部类。通过调用Lifecycling的lifecycleEventObserver方法,将传入的Observer对象转换为LifecycleEventObserver对象。并且添加了一个mState字段来保存Observer的状态。
handleLifecycleEvent()
ReportFragment的dispatch方法会调用LifecycleRegistry的handleLifecycleEvent方法来处理Event。
handleLifecycleEvent方法最终会调用sync方法来同步所有Observer的状态。在sync中,如果当前State小于链表中第一Observer的State,会调用backwardPass方法后向前同步所有Observer的Sate。如果当前状态大于最后一个Observer的State,调用forwardPass从前向后遍历Observer同步State。
backwardPass()
Lifecycling
lifecycleEventObserver()
lifecycleEventObserver方法负责通过传入LifecycleObserver对象构建一个LifecycleEventObserver对象。
getObserverConstructorType
resolveObserverCallbackType
generatedConstructor()
generatedConstructor方法获取生成的GeneratedAdapter的构造函数。
参考
最后更新于