我已经开始学习架构组件,但是找不到一件事。
LifecycleFragment仅创建一个新的LifecycleRegistry对象,该对象不会开始观察片段的生命周期。
我猜想,例如,当我们将片段作为第一个参数放入LiveData.observe()时,LifecycleRegistry对象开始监听该片段的生命周期,但是我在源代码中找不到任何证明。
问题:LifecycleRegistry对象何时以及如何开始观察片段的生命周期并刷新LifecycleRegistry.mState
?
最佳答案
有一个名为ContentProvider
的LifecycleRuntimeTrojanProvider
合并到应用程序的AndroidManifest.xml
中。在其onCreate
方法中,它初始化了一个称为LifecycleDispatcher
的单例,该单例负责更新所有LifecycleRegistry
实例。LifecycleDispatcher
使用自API 14以来一直存在的Application.registerActivityLifecycleCallbacks方法来在创建新活动时获得通知。此时,它将ReportFragment
的实例注入到活动中。 ReportFragment
在必要时使用Fragment
生命周期回调来更新活动的LifecycleRegistry
,如下所示:
@Override
public void onStop() { // Showing onStop as example
super.onStop();
dispatch(Lifecycle.Event.ON_STOP);
}
private void dispatch(Lifecycle.Event event) {
if (getActivity() instanceof LifecycleRegistryOwner) {
((LifecycleRegistryOwner) getActivity()).getLifecycle().handleLifecycleEvent(event);
}
}
如果新活动是
FragmentActivity
,则LifecycleDispatcher
调用FragmentManager.registerFragmentLifecycleCallbacks以获得该活动的片段生命周期事件的通知。如果片段是onFragmentCreated
,它会以与以前相同的方式将onFragmentStarted
,onFragmentResumed
和LifecycleRegistry
回调中继到LifecycleRegistryOwner
。在片段上调用相应的回调之后,将调用
onFragmentPaused
,onFragmentStopped
和onFragmentDestroyed
回调,但是必须在之前调用LifecycleObserver
回调。因此,无论何时创建片段,LifecycleDispatcher
都会将LifecycleDispatcher.DestructionReportFragment
的实例注入其中。 DestructionReportFragment
的生命周期回调用于为暂停,停止和销毁事件更新注册表。我无法链接到该代码,因为它尚未发布,但是将库添加到项目后,您可以在Android Studio中浏览它。