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

一道面试题:Activity是如何实现LifecycleOwner的?

时间:2023-03-13 14:34:03 科技观察

我们都知道Activity可以作为LifecycleOwner为LiveData的使用提供条件,那么Activity是如何实现LifecycleOwner的呢?Activity虽然实现了LifecycleOwner接口,但是并没有实现相关处理,只是增加了一个Fragment来代理Lifecycle分发。这种通过Fragment代理Activity行为的设计在其他一些库中也经常出现,相对侵入性更强,也更优雅。SupportActivityActivity通过继承SupportActivity实现了LifecycleOwner接口。注意在AndroidX中SupportActivity改为ComponentActivitypublicclassSupportActivityextendsActivityimplementsLifecycleOwner{...privateLifecycleRegistrymLifecycleRegistry=newLifecycleRegistry(this);...@OverrideprotectedvoidonSaveInstanceState(BundleoutState);{mLifecycleRegistry.State.markStateonSaveInstanceState(outState);}...@OverridepublicLifecyclegetLifecycle(){returnmLifecycleRegistry;}}SupportActivity声明了mLifecycleRegistry对象,但并不直接使用它进行生命周期分发,而是通过activity.getLifecycle()被ReportFragment使用。ReportFragmentSupportActivity在onCreate为自己添加了ReportFragment:@RestrictTo(LIBRARY_GROUP)publicclassSupportActivityextendsActivityimplementsLifecycleOwner{//...@Override@SuppressWarnings("RestrictedApi")protectedvoidonCreate(@NullableBundlessavedInstanceState){super.onCreate(savedInstanceState);ReportIfNegment.inject(this)}//...}injectIfNeededIn是ReportFragment的静态方法publicstaticvoidinjectIfNeededIn(Activityactivity){//ProcessLifecycleOwnershouldalwayscorrectlyworkandsomeactivitiesmaynotextend//FragmentActivityfromsupportlib,soweuseframeworkfragmentsforactivitiesandroid.app.FragmentManagermanager=activity.getFragmentManager();if(manager.findFragmentByTag(REPORT_FRAGMENT_TAG)==null){manager.beginTransaction().add(newReportFragment(),REPORT_FRAGMENT_TAG).commit();//希望wearethefirsttomakeatransaction.manager.executePendingTransactions();}}低版本Activity兼容LifecycleSupportActivity伴随Lifecycle,android.arch.lifecycle:最早还没有扩展继承SupportActivity的Activity也提供支持。ReportFragment的注入是通过LifecycleDispatcher实现的:privatefinalFragmentCallbackmFragmentCallback;DispatcherActivityCallback(){mFragmentCallback=newFragmentCallback();}@OverridepublicvoidonActivityCreated(Activityactivity,BundlesavedInstanceState){if(activityinstanceofFragmentActivity){((FragmentActivity)activity).getSupportFragmentManager().registerFragmentLifecycleCallbacks(mFragment.IfFragmentCallbackInjectIntactivity});}}}之前还纳闷为什么ReportFragment的实现没有写到SupportActivity里面,看到这个终于明白了它存在的意义LifecycleDispatcher不需要在Application中调用,他通过ContentProviderpublicclassProcessLifecycleOwnerInitializerextendsContentProvider{@OverridepublicbooleanonCreate(){LifecycleDispatcher.init(getContext());ProcessLifecycleOwner.init(getContext());returntrue;}}在android.arch中注册实现初始化AndroidManifestofextensionssaar:/application>${applicationId}占位符以避免权限冲突。可见我们在非侵入性上做到了极致。这种非侵入式的初始化方式非常值得我们借鉴和使用。两种Fragment通过上面的分析,我们知道Activity是通过ReportFragment实现LifecycleOwner。那么Activity中添加的LifecycleOwner的生命周期是否与Activity的Fragment一致呢?答案是不。Android中有两种Fragment:android.support.v4ADK自带的android.app.FragmentSupport包中的.app.Fragment(AndroidX也归为此类)由于前者已经被@Deprecated,后者现在常用的就是FragmentofSupport或者AndroidX。为了低版本兼容,ReportFragment是前者。两个Fragment生命周期的实际回调对于Activity是不同的。以onResume和onStart为例,Activity的实际回调如下:上表中()中的数字表示执行顺序,所以你会发现adk片段onStart晚于support片段,但是onResume较早执行。虽然Activity的LifecycleOwner是基于Fragment实现的,但是同一个Activity的LifecycleOwner其实和Fragment的生命周期回调是不一致的。需要特别注意的是我们的开发,不要查看Fragment和LifecycleOwner生命周期中的处理产生时序依赖。总结通过分析Activity实现LifecycleOwner的源码,我们得到如下结论:Activity并没有直接调用HandleLifecycleEvent分发生命周期,而是通过ReportFragment实现了ReportFragment的注入,整个过程是无侵入的。同一个Activity值得借鉴和借鉴。LifecycleOwner和Fragment的生命周期回调其实是不一致的,需要特别注意