我已经开始学习架构组件,但是找不到一件事。

LifecycleFragment仅创建一个新的LifecycleRegistry对象,该对象不会开始观察片段的生命周期。

我猜想,例如,当我们将片段作为第一个参数放入LiveData.observe()时,LifecycleRegistry对象开始监听该片段的生命周期,但是我在源代码中找不到任何证明。

问题:LifecycleRegistry对象何时以及如何开始观察片段的生命周期并刷新LifecycleRegistry.mState

最佳答案

有一个名为ContentProviderLifecycleRuntimeTrojanProvider合并到应用程序的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,它会以与以前相同的方式将onFragmentStartedonFragmentResumedLifecycleRegistry回调中继到LifecycleRegistryOwner

在片段上调用相应的回调之后,将调用onFragmentPausedonFragmentStoppedonFragmentDestroyed回调,但是必须在之前调用LifecycleObserver回调。因此,无论何时创建片段,LifecycleDispatcher都会将LifecycleDispatcher.DestructionReportFragment的实例注入其中。 DestructionReportFragment的生命周期回调用于为暂停,停止和销毁事件更新注册表。

我无法链接到该代码,因为它尚未发布,但是将库添加到项目后,您可以在Android Studio中浏览它。

07-27 20:54