Lifecycle原理
-
角色定义 (抽象层):
-
LifecycleOwner
(被观察者): 代表拥有生命周期的组件(如Activity
,Fragment
)。它持有并暴露一个Lifecycle
对象 (getLifecycle()
)。 -
Lifecycle
(桥梁/状态机): 抽象类。核心作用是:-
维护
LifecycleOwner
的当前生命周期状态 (State
)。 -
管理(添加/移除)
LifecycleObserver
(观察者集合)。 -
负责在宿主状态变化时,将对应的生命周期事件 (
Event
) 分发给所有注册的观察者。 -
定义关键状态
State
(DESTROYED
,INITIALIZED
,CREATED
,STARTED
,RESUMED
) 和事件Event
(ON_CREATE
,ON_START
, ...)。
-
-
LifecycleObserver
(观察者基类): 一个空接口。它代表任何希望监听生命周期的对象。具体的回调机制通过其子接口(如DefaultLifecycleObserver
,LifecycleEventObserver
)或注解处理器(@OnLifecycleEvent
)实现。这种设计提供了最大的灵活性。
-
-
具体实现 (实现层):
-
宿主 (
LifecycleOwner
实现):ComponentActivity
/Fragment
(androidx) 实现了LifecycleOwner
接口。-
它们的
getLifecycle()
方法返回一个LifecycleRegistry
(是Lifecycle
的具体实现) 实例 (mLifecycleRegistry
)。
-
-
事件捕获:
ComponentActivity
在其onCreate
中注入一个无 UI 的ReportFragment
。-
API >= 29: 直接注册
Activity
生命周期回调。 -
API < 29:
ReportFragment
自身监听Activity
的生命周期回调。 -
在
ReportFragment
的每个生命周期方法 (onCreate
,onStart
, ...) 中,调用dispatch(Lifecycle.Event)
方法。
-
-
事件传递到桥梁:
ReportFragment.dispatch()
最终调用宿主Activity
/Fragment
持有的LifecycleRegistry
实例的handleLifecycleEvent(Event)
方法。 -
状态更新与分发 (
LifecycleRegistry
核心工作):-
handleLifecycleEvent(Event)
:-
根据传入的
Event
计算出新的目标State
(Event.getTargetState()
)。 -
调用
moveToState(State)
。
-
-
moveToState(State)
:-
更新
LifecycleRegistry
自身的当前状态mState
为目标State
。 -
如果没有重入(当前不在处理事件或添加观察者中),则调用
sync()
进行同步。
-
-
sync()
(同步引擎):-
检查宿主是否有效(弱引用)。
-
循环执行直到所有观察者状态与
mState
同步 (isSynced()
):-
检查状态滞后 (需要“前进” -
forwardPass
): 如果mState
大于mObserverMap
中最新观察者的状态 (newest().mState
),说明观察者整体落后于宿主状态。调用forwardPass()
。 -
检查状态超前 (需要“后退” -
backwardPass
): 如果mState
小于mObserverMap
中最旧观察者的状态 (eldest().mState
),说明观察者整体超前于宿主状态(通常发生在配置更改恢复时)。调用backwardPass()
。
-
-
-
forwardPass()
/backwardPass()
:-
遍历观察者集合 (
mObserverMap
)。 -
对每个状态未同步的观察者 (
ObserverWithState
),计算它需要经历哪些Event
才能达到mState
。 -
对每个需要分发的
Event
:-
调用
observer.dispatchEvent(owner, event)
。
-
-
-
ObserverWithState.dispatchEvent(owner, event)
:-
更新该观察者自身的状态 (
mState = min(mState, event.getTargetState())
-> 调用mLifecycleObserver.onStateChanged
->mState = event.getTargetState()
)。 -
调用
mLifecycleObserver.onStateChanged(owner, event)
。关键点:mLifecycleObserver
是在addObserver
时通过Lifecycling.lifecycleEventObserver(observer)
动态创建的适配器。
-
-
-
适配到具体回调 (
Lifecycling
的魔法):-
Lifecycling.lifecycleEventObserver(Object observer)
: 分析传入的observer
的实际类型:-
如果实现了
FullLifecycleObserver
(包含所有具体回调方法如onCreate
), 则返回FullLifecycleObserverAdapter
。 -
如果实现了
LifecycleEventObserver
(只有onStateChanged
方法), 则直接返回它。 -
如果使用了
@OnLifecycleEvent
注解, 则生成并返回一个基于反射或代码生成的适配器。 -
其他情况可能抛出异常。
-
-
FullLifecycleObserverAdapter.onStateChanged(source, event)
: 将通用的onStateChanged
调用适配到FullLifecycleObserver
的具体方法 (onCreate
,onStart
, ...)。这就是为什么DefaultLifecycleObserver
(继承自FullLifecycleObserver
) 的方法会被调用。 -
LifecycleEventObserver.onStateChanged(source, event)
: 直接传递给实现了该接口的观察者。
-
-
-
观察者注册 (
addObserver
流程):-
创建
ObserverWithState
,初始状态为INITIALIZED
(或如果宿主已DESTROYED
则为DESTROYED
)。 -
将
observer
和ObserverWithState
添加到mObserverMap
。 -
计算该观察者的目标状态 (
calculateTargetState()
) - 通常是宿主当前的mState
。 -
通过
while
循环,使用Event.upFrom()
计算出从当前状态到目标状态需要经历的所有中间事件 (Event
)。 -
依次调用
observer.dispatchEvent(owner, event)
分发这些事件,使新观察者快速达到宿主当前状态(补偿历史事件)。 -
最后调用
sync()
确保所有观察者状态最终一致。
-