当前位置: 首页 > 科技观察

高级源码之生命周期组件原理分析

时间:2023-03-20 12:20:07 科技观察

前言如何使用android.arch.lifecycle包提供的类来控制数据、监听器等的生命周期。同时,LiveData和ViewModel的生命周期也依赖于Lifecycle框架;今天我们就来说说生命周期的实现原理,先分析一下。为什么要引入生命周期?1.没有引入Lifecycle来处理Activity或Fragment组件的生命周期相关时,你难免会遇到这样的问题;在Activity的onCreate()中初始化一些成员(比如MVP架构中的Presenter,或者AudioManager、MediaPlayer等),然后在onStop中对这些成员进行相应的处理。在onDestroy中释放这些资源,所以我们的代码可能是这样的;{presenter=newMyPresenter();presenter.create();}publicvoidonDestroy(){super.onDestroy();presenter.destory();}}代码没有问题,关键问题是在实际生产环境中,这样的代码会很复杂,你最终会得到太多类似的调用,并且会导致onCreate()和onDestroy()方法变得非常臃肿;2、Lifecycle的介绍Lifecycle是一个类,它保存着组件(如Activity或Fragment)的生命周期状态信息,并允许其他对象观察这个状态;代码如下:Prestener继承LifecycleObserver接口publicinterfaceIPresenterextendsLifecycleObserver{@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)voidonCreate(@NotNullLifecycleOwnerowner);@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)voidonDestroy(@NotNullLifecycleOwnerowner);@OnLifecycleEvent(Lifecycle.Event.ON_ANY)voidonLifecycleChanged(@NotNullLifecycleOwnerowner,@NotNullLifecycle.Eventevent);}publicclassBasePresenterimplementsIPresenter{privatestaticfinalStringTAG="com.qingmei2.module.base.BasePresenter";@OverridepublicvoidonLifecycleChanged(@NotNullLifecycleOwnerowner,@NotNullLifecycle.Eventevent){}@OverridepublicvoidonCreate(@NotNullLifecycleOwnerowner){Log.d("tag","BasePresenter.onCreate"+this.getClass().toStringcy());}@OverridepublicvoidonDestroy(){Log.d("tag","BasePresenter.onDestroy"+this.getClass().toString());}}直接列出了我要观察Presenter的生命周期事件,然后封装在BasePresenter中这样,BasePresenter的每个子类都可以感知Activity容器对应的生命周期事件,在子类重写的方法中,添加ObserverpublicclassMainActivityextendsAppCompatActivity{privateIPresentermPresenter;@OverrideprotectedvoidonCreate(外滩lesavedInstanceState){super.onCreate(savedInstanceState);Log.d("tag","onCreate"+this.getClass().toString());setContentView(R.layout.activity_main);mPresenter=newMainPresenter(this);getLifecycle().addObserver(mPresenter);//添加LifecycleObserver}@OverrideprotectedvoidonDestroy(){Log.d("tag","onDestroy"+this.getClass().toString());super.onDestroy();}}per当Activity中对应的生命周期发生变化时,Presenter会执行对应事件注解的方法。2.层层深入分析Lifecycle原理。从Activity中获取Lifecycle实际上是通过Activity的父类ComponentActvitiy获取的,ComponentActvitiy实现了LifecycleOwner接口。可以获取Lifecycle,最后注册LifecycleObserver获取生命周期回调1.OnCreate在ComponentActvitiy的onCreate方法中可以看到ReportFragment的创建/*ComponentActvitiy*/@OverrideprotectedvoidonCreate(@NullableBundlesavedInstanceState){...ReportFragment.injectIfNeededIn(this);...}2、getLifecycle方法/*ComponentActvitiy*/privatefinalLifecycleRegistrymLifecycleRegistry=newLifecycleRegistry(this);@NonNull@OverridepublicLifecyclegetLifecycle(this){returnmLifecycleRegister;}Life3,Lifecycle.EventLifecycle.Event是一个枚举类,这里的生命周期Event不是Fragment,在后面的生命周期处理中会用到。publicenumEvent{ON_CREATE,ON_START,ON_RESUME,ON_PAUSE,ON_STOP,ON_DESTROY,ON_ANY;...}4。ReportFragment的创建ReportFragment是一个没有界面的Fragment。如果你学过Glide的原理,你应该也知道这个方法,就是通过InvisibleFragment来感知生命周期,让用户不用去思考生命周期。SDK29以上版本使用LifecycleCallbacks.registerIn(activity)。/*ReportFragment*/publicstaticvoidinjectIfNeededIn(Activityactivity){if(Build.VERSION.SDK_INT>=29){//OnAPI29+,wecanregisterforthecorrectLifecyclecallbacksdirectlyLifecycleCallbacks.registerIn(activity);}//PriortoAPI29andtomaintaincompatibilitywitholderversionsof//ProcessLifecycleOwner(whichmaynotbeupdatedwhenlifecycle-runtimeisupdatedand//needtosupportactivitiesthatdon'textendfromFragmentActivityfromsupportlib),//使用框架工作片段来获取生命周期事件的正确时机manager.executePendingTransactions();}}5.LifecycleCallbacks.registerIn(activity)LifecycleCallbacks实现Application.ActivityLifecycleCallbacks接口。SDK29以上的Lifecycle分发是Application分发的,Activity注册可以回调。大名鼎鼎的LeakCanary就是在监控Activity的生命周期,同样使用Application.ActivityLifecycleCallbacks。@RequiresApi(29)staticclassLifecycleCallbacksimplementsApplication.ActivityLifecycleCallbacks{staticvoidregisterIn(Activityactivity){activity.registerActivityLifecycleCallbacks(newLifecycleCallbacks());}...@OverridepublicvoidonActivityPostCreated(@NonNullActivityactivity,@NullableBundlesavedInstanceState){dispatch(activity,Lifecycle.Event.ON_CREATE);}。..}6.ReportFragment.dispatch版本兼容性如果SDK版本低于29,则在ReportFragment的每个生命周期方法中都会调用dispatch方法。比如onActivityCreated。反正不管你用LifecycleCallbacks.registerIn(activity)还是Fragment的生命周期回调,最后都会dispatch。@OverridepublicvoidonActivityCreated(BundlesavedInstanceState){super.onActivityCreated(savedInstanceState);dispatchCreate(mProcessListener);dispatch(Lifecycle.Event.ON_CREATE);}privatevoiddispatch(@NonNullLifecycle.Eventevent){if(Build.VERSION.SDK_INT<29){//OnlydispatcheventsfromReportFragmentonAPIlevelsprior//toAPI29.OnAPI29+,thisishandledbytheActivityLifecycleCallbacks//addedinReportFragment.injectIfNeededIndispatch(getActivity(),event);}}staticvoiddispatch(@NonNullActivityactivity,@NonNullLifecycle.Eventevent){if(activityinstanceofLifecycleRegistryOwner){((LifecycleRegistryOwner)activity).getLifecycleEvent().(event);return;}if(activityinstanceofLifecycleOwner){Lifecyclelifecycle=((LifecycleOwner)activity).getLifecycle();if(lifecycleinstanceofLifecycleRegistry){((LifecycleRegistry)lifecycle).handleLifecycleEvent(event);}}}7、Lifecycle.StateState只有5个,但是生命周期超过5个,所以Google在设计的时候,创建过程是向前的,并且无论如何,销毁过程仍在进行。Lifecycle.State/*Lifecycle.State*/publicenumState{DESTROYED,INITIALIZED,CREATED,STARTED,RESUMED;publicbooleanisAtLeast(@NonNullStatestate){returncompareTo(state)>=0;}}8.handleLifecycleEventLifecycleRegistryOwner也继承了LifecycleOwner,所以他们在最后会执行LifecycleRegistry的handleLifecycleEvent方法。只需处理Lifecycle.Event并将其转换为Lifecycle.State/*Lifecycle.Event*/@NonNullpublicStategetTargetState(){switch(this){caseON_CREATE:caseON_STOP:returnState.CREATED;caseON_START:caseON_PAUSE:returnState.STARTED;caseON_RESUME:returnState。RESUMED;caseON_DESTROY:returnState.DESTROYED;caseON_ANY:break;}thrownewIllegalArgumentException(this+"hasnottargetstate");}Lifecycle.State继续向下传递,先用mState保存,再用sync方法处理。/*LifecycleRegistry*/publicvoidhandleLifecycleEvent(@NonNullLifecycle.Eventevent){enforceMainThreadIfNeeded("handleLifecycleEvent");moveToState(event.getTargetState());}privatevoidmoveToState(Statenext){if(mState==next){return;}//保存stateStatemState=next;if(mHandlingEvent||mAddingObserverCounter!=0){mNewEventOccurred=true;//wewillfigureoutwhattodoonupperlevel.return;}mHandlingEvent=true;sync();mHandlingEvent=false;}9.这里使用之前的sync保存方法mState,用于比较,判断生命周期是正向执行还是反向执行("LifecycleOwnerofthisLifecycleRegistryisalready"+"garbagecollected.Itistoolatetochangelifecycyclestate.");}while(!isSynced()){mNewEventOccurred=false;//noneedtocheckeldestfornullability,因为isSynced/doesitforus与之前的保存方法相比组件的状态。(mState.compareTo(mObserverMap.eldest().getValue().mState)<0){//返回执行过程backwardPass(lifecycleOwner);}Map.Entrynewest=mObserverMap.newest();if(!mNewEventOccurred&&newest!=null&&mState.compareTo(newest.getValue().mState)>0){//正向执行流程forwardPass(lifecycleOwner);}}mNewEventOccurred=false;}10.forwardPass的反向逻辑几乎一样,只是执行backwardPass,先转换Stata,最后执行observer.dispatchEvent这里和Lifecycle.State被传输回Lifecycle.Event,然后被派发给观察者。/*Lifecycle.Event*/@NullablepublicstaticEventupFrom(@NonNullStatestate){switch(state){caseINITIALIZED:returnON_CREATE;caseCREATED:returnON_START;caseSTARTED:returnON_RESUME;default:returnull;}}switchEvent.upFrom,发送observer.dispatchEvent/*LifecycleRegistry*/privatevoidforwardPass(LifecycleOwnerlifecycleOwner){Iterator>ascendingIterator=mObserverMap.iteratorWithAdditions();while(ascendingIterator.hasNext()&&!mNewEventOccurredOccurred){Map.Entrybbserver=ascendingIterator.next();ObserverWithStateobserver=entry.getValue();while((observer.mState.compareTo(mState)<0&&!mNewEventOccurred&&mObserverMap.contains(entry.getKey()))){pushParentState(observer.mState);//transformfinalEventevent=Event.upFrom(observer.mState);if(event==null){thrownewIllegalStateException("noeventupfrom"+observer.mState);}//发送observer.dispatchEvent(lifecycleOwner,event);popParentState();}}}11.发送LifecycleStateObserverWithState发送Lifecycle.Event,到此结束,可以收到staticclassObserverWithState{StatemState;LifecycleEventObservermLifecycleObserver;ObserverWithState(LifecycleObserverobserver,StateinitialState){mLifecycleObserver=LifecycleObserver=Lifecycle.lifecycleEventObserver(observer);mState=initialState;}/*调度生命周期状态*/voiddispatchEvent(LifecycleOwnerowner,Eventevent){StatenewState=event.getTargetState();mState=min(mState,newState);mState=min(mState,newState);mState=min(mState,newState);mState.onStateChanged(owner,event);mState=newState;}}原理比较明确:Activity/Fragment实现LifecycleOwner接口,分发通过LifecycleRegistry对应生命周期中的事件Lifecycle.Event,并回调订阅方法对应的生命周期观察者LifecycleObserver,有可取之处。与其他架构组件之间的协作相比,Lifecycle更简单,也更独立;LifecycleObserver接口(LifecycleObserver):实现该接口的类可以通过注解LifecycleOwner类的addObserver(LifecycleObserver)添加o)方法注册,LifecycleObserver注册后可以观察LifecycleOwner的生命周期事件;LifecycleOwner接口(Lifecycleholder):实现该接口的类持有生命周期(Lifecycleobject),接口的生命周期(LifecycleObject)的变化会被其注册的观察者LifecycleObserver观察到并触发其相应的事件;Lifecycle(生命周期):与LifecycleOwner不同,LifecycleOwner本身持有Lifecycle对象,LifecycleOwner通过其LifecyclegetLifecycle()接口获取InternalLifecycle对象;State(当前生命周期的状态);Event(当前生命周期变化对应的事件)。当Lifecycle发生变化时,比如进入onCreate,会自动发出ON_CREATE事件;广场建筑中的知识点;本文转载自微信公众号《Android开发编程》