Lifecycle 原理 文章目录Jetpack Lifecycle 原理一、核心角色二、生命周期事件与状态的映射三、工作流程addObserver()生命周期的传递过程四、关键实现细节1. Activity 如何感知生命周期2. 添加观察者时addObserver做了什么3. 状态同步核心sync()4. 事件如何到达自定义 Observer五、面试官可能追问的问题六、总结Jetpack Lifecycle 原理一、核心角色角色接口/类职责被观察者LifecycleOwner(接口)拥有生命周期如ComponentActivity、Fragment对外提供Lifecycle观察者LifecycleObserver空接口监听生命周期事件通常使用DefaultLifecycleObserver桥梁Lifecycle抽象类管理观察者列表、分发事件具体实现在LifecycleRegistry三者的关系LifecycleOwner 持有并暴露 Lifecycle一一对应Lifecycle 维护 LifecycleObserver 以及生命周期的监听 和 生命周期变更事件的派发 本质观察者模式状态机通过抽象解耦。二、生命周期事件与状态的映射StateDESTROYED、INITIALIZED、CREATED、STARTED、RESUMED状态是有序的可比较EventON_CREATE、ON_START、ON_RESUME、ON_PAUSE、ON_STOP、ON_DESTROY、ON_ANY三、工作流程addObserver()第一步包装观察者确定初始状态StateinitialStatemStateDESTROYED?DESTROYED:INITIALIZED;ObserverWithStatestatefulObservernewObserverWithState(observer,initialState);根据当前LifecycleOwner的mStateowner的当前状态决定新观察者的初始状态。将原始observer包装成ObserverWithState内部会通过Lifecycling.lifecycleEventObserver()把观察者转换成统一的LifecycleEventObserver封装了状态适配器模式, 让LifecycleRegistry可以用标准、简单的方式分发事件而不用关心观察者具体是怎么实现的。第二步存入 Map去重ObserverWithStatepreviousmObserverMap.putIfAbsent(observer,statefulObserver);if(previous!null)return;mObserverMap是一个支持安全遍历的LinkedHashMap。 内部维护了Observer和其状态的键值对如果同一个observer已经添加过直接返回不重复处理。第三步立即同步状态关键StatetargetStatecalculateTargetState(observer);while(statefulObserver.mState.compareTo(targetState)0){EventeventEvent.upFrom(statefulObserver.mState);statefulObserver.dispatchEvent(lifecycleOwner,event);targetStatecalculateTargetState(observer);}计算观察者应该达到的目标状态targetState即宿主状态。循环只要观察者的当前状态落后于目标状态就通过Event.upFrom()获取下一个要升级的事件例如INITIALIZED→ON_CREATE→CREATED然后调用dispatchEvent分发出去。这样即使在onResume后才添加观察者它也会立即收到ON_CREATE、ON_START、ON_RESUME等缺失的事件。注意Event.upFrom(state)返回从该状态到下一个状态所需的事件比如INITIALIZED返回ON_CREATECREATED返回ON_START依此类推。第四步触发全局同步syncif(!isReentrance){sync();}isReentrance判断是否发生了重入例如在dispatchEvent过程中又调用了addObserver。如果不在重入中则调用sync()确保所有观察者的状态与宿主mState保持一致主要处理那些添加过程中又发生了新的状态变化的情况。补充说明为什么能防止重入addObserver内部用mAddingObserverCounter和mHandlingEvent两个标志位来检测重入。如果正在添加其他观察者或正在分发事件就暂缓最后的sync()避免死循环或重复分发。生命周期的传递过程LifecycleObserverLifecycleRegistryReportFragmentComponentActivityLifecycleObserverLifecycleRegistryReportFragmentComponentActivityalt[观察者状态落后大-部分情况][观察者状态超前极-少]onCreate() 注入 ReportFragmenthandleLifecycleEvent(ON_CREATE/START/RESUME...)moveToState() 更新 mStatesync() 同步所有观察者状态forwardPass() 向前推进状态backwardPass() 向后回退dispatchEvent(Event)onStateChanged() → 具体回调 (onStart/onStop...)大致流程源头ComponentActivity或 Fragment在onCreate中注入一个没有界面的ReportFragment 以感知Activity的生命周期。捕获ReportFragment的生命周期方法如onStart、onResume会被系统调用它拿到事件后直接转发给LifecycleRegistry。分发LifecycleRegistry收到事件比如ON_RESUME会更新自己的内部状态mState RESUMED(表示宿主的状态)然后遍历所有已注册的观察者调用sync()方法如果观察者状态低于当前状态 → 调用forwardPass逐个分发事件如ON_RESUME如果观察者状态高于当前状态少见如销毁过程→ 调用backwardPass分发销毁事件回调最终通过适配器如FullLifecycleObserverAdapter将事件转换为具体的回调方法如onStart()、onStop()调用到你自定义的观察者中。适配器的作用是把多种形态的LifecycleObserver注解、DefaultLifecycleObserver、FullLifecycleObserver等统一成LifecycleEventObserver这一种接口让LifecycleRegistry可以用标准、简单的方式分发事件而不用关心观察者具体是怎么实现的。一句话总结Activity 通过一个隐藏 Fragment 感知生命周期交给LifecycleRegistry做状态机管理再由它同步给所有观察者。四、关键实现细节1. Activity 如何感知生命周期API ≥ 29通过Activity.registerActivityLifecycleCallbacks直接注册回调。API 29往 Activity 中添加一个无界面的ReportFragment它的生命周期回调会同步转发给LifecycleRegistry。2. 添加观察者时addObserver做了什么将观察者包装成ObserverWithState内部持有当前状态。存入mObserverMap自定义安全可遍历 Map。立即同步如果宿主已经有生命周期状态例如在onResume之后才添加会立即forwardPass将缺失的事件ON_CREATE、ON_START、ON_RESUME按顺序分发给新观察者。3. 状态同步核心sync()比较mState宿主当前状态与mObserverMap中最老/最新观察者的状态。向前同步forwardPass观察者状态落后 → 逐步发出Event.upFrom(state)直到追上mState。向后同步backwardPass观察者状态超前极少场景如 Fragment 嵌套→ 发出回退事件。4. 事件如何到达自定义 Observer观察者可能实现DefaultLifecycleObserver、LifecycleEventObserver或使用注解。Lifecycling.lifecycleEventObserver()根据类型返回适配器FullLifecycleObserverAdapter将Event转为具体onCreate/onStart/...回调。注解方式通过注解处理器生成适配代码。最终调用mLifecycleObserver.onStateChanged(owner, event)再转发到业务方法如onStart()。五、面试官可能追问的问题Q1为什么LifecycleObserver是空接口为了支持多种监听方式注解OnLifecycleEvent和接口实现DefaultLifecycleObserver。空接口作为标记具体回调通过适配器转换。Q2LifecycleRegistry如何保证线程安全内部通过enforceMainThreadIfNeeded强制主线程操作避免并发问题。早期版本有锁和重入标记现在直接要求主线程。Q3如果在onResume之后添加观察者它会错过onCreate事件吗不会。addObserver会立即计算目标状态并通过forwardPass把缺失的事件按顺序补发。Q4Lifecycle如何处理内存泄漏LifecycleRegistry中持有LifecycleOwner时使用WeakReference并且onDestroy事件后会停止分发。Q5ReportFragment为什么还在用API 29 以上不是有回调吗为了向下兼容。API 29 用LifecycleCallbacks低版本用无界面的 Fragment保证所有 Android 版本都能捕获生命周期。六、总结Lifecycle 通过LifecycleOwnerActivity/Fragment利用ReportFragment或系统回调捕获生命周期事件交给LifecycleRegistry维护状态机再通过适配器模式将事件分发给注册的LifecycleObserver实现生命周期感知。深入理解 Jetpack Lifecycle(原理篇)你好我是朱涛。最近我打算系统化梳理下 Android Jetpa - 掘金

本月热点