LifecycleRegistry 实例何时开始监听 LifecycleOwner 的生命周期变化?

When does a LifecycleRegistry instance start listening to LifecycleOwner's lifecycle changes?

我已经开始学习架构组件,但找不到任何东西。

LifecycleFragment just creates a new LifecycleRegistry对象,不开始观察片段的生命周期。

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

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

LifecycleFragment 和LifecycleActivity 目前没有完全实现。这些 类 将在 lib 达到 1.0 版本时实施。目前,您可以使用这些 LifecycleRegistry 来观察 LiveData 对象。这些对象基于未来的结果,例如是您数据库中的一个对象。

官方文档可以在这里找到:https://developer.android.com/topic/libraries/architecture/index.html

关于您提到的两个 类 的官方声明:

Lifecycle Fragment and ActivityCompat in the Support Library do not yet implement LifecycleOwner interface. They will when Architecture Components reaches 1.0.0 version.

正如Mordag所说,截至目前,LifecycleActivity和LifecycleFragment都还没有实现。在他们的文档中 Google 说:

Any custom fragment or activity can be turned into a LifecycleOwner by implementing the built-in LifecycleRegistryOwner interface (instead of extending LifecycleFragment or LifecycleActivity).

然而,这只是故事的一半,因为您自然会使用这些 Lifecycle Aware 组件来对您的 Activity/Fragment 生命周期作出反应,而使用它们的代码片段它只是行不通,因为初始化带有 Activity/Fragment 的 LifecycleRegistry

LifecycleRegistry lifecycleRegistry = new LifecycleRegistry(this);

只会让你获得一个处于 INITIALIZED 状态的生命周期。

所以,长话短说,为了让这个现在(在他们的 1.0 版本之前)工作,你必须实施实施 LifecycleRegistry 的 Activity/Fragment 的生命周期。因此,对于 Activity/Fragment 的每个回调,您需要执行以下操作:

public class ScoreMasterFragment extends Fragment
                                 implements LifecycleRegistryOwner {


    private LifecycleRegistry lifecycle;

    @Override
    public LifecycleRegistry getLifecycle() {
        return lifecycle;
    }

    public ScoreMasterFragment(){
         lifecycle = new LifecycleRegistry(this);
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //more code here
        lifecycle.handleLifecycleEvent(Lifecycle.Event.ON_CREATE);
    }

    @Override
    public void onStart() {
        super.onStart();
        //more code here
        lifecycle.handleLifecycleEvent(Lifecycle.Event.ON_START);

    }

    @Override
    public void onResume() {
        super.onResume();
        //more code here
        lifecycle.handleLifecycleEvent(Lifecycle.Event.ON_RESUME);
    }

    @Override
    public void onPause() {
        super.onPause();
        //more code here
        lifecycle.handleLifecycleEvent(Lifecycle.Event.ON_PAUSE);
    }

    @Override
    public void onStop() {
        super.onStop();
        //more code here
        lifecycle.handleLifecycleEvent(Lifecycle.Event.ON_STOP);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        //more code here
        _lifecycle.handleLifecycleEvent(Lifecycle.Event.ON_DESTROY);
    }

这可能会出现在未来的 LifecycleActivity 和 LifecycleFragment 的代码中,但在那之前,如果您 Activities/Fragments 观察某些 LifecycleAware 对象(如 LiveData),您将不得不这样做。

在 LiveData 的情况下,因为它不会通知它的观察者,除非它们至少处于 STARTED 状态,在其他情况下,因为其他 LifecycleAware 组件无法对生命周期做出反应,如果它的唯一状态是 INITIALIZED。

有一个名为 LifecycleRuntimeTrojanProviderContentProvider 已合并到应用程序的 AndroidManifest.xml 中。在其 onCreate 方法中,它初始化了一个名为 LifecycleDispatcher 的单例,它负责更新所有 LifecycleRegistry 个实例。

LifecycleDispatcher 使用自 API 14 以来一直存在的 Application.registerActivityLifecycleCallbacks 方法在创建新的 activity 时得到通知。此时它将 ReportFragment 的一个实例注入到 activity 中。 ReportFragment 使用 Fragment 生命周期回调在必要时更新 activity 的 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);
    }
}

如果新 activity 是 FragmentActivityLifecycleDispatcher 调用 FragmentManager.registerFragmentLifecycleCallbacks 以获取 activity 片段生命周期事件的通知。它会将 onFragmentCreatedonFragmentStartedonFragmentResumed 回调中继到 LifecycleRegistry,以防片段是 LifecycleRegistryOwner,方法与之前相同。

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

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

LifecycleActivity、LifecycleFragment 和 LifecycleRegistryOwner 接口在 API 级别 1.0.0 中已弃用。使用 android.support.v7.app.AppCompatActivity 和 android.support.v4.app.Fragment 代替它。 官方文档在这里 LifecycleActivity LifeCycleFragment