我们都知道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:
