【问题标题】:When does a LifecycleRegistry instance start listening to LifecycleOwner's lifecycle changes?LifecycleRegistry 实例何时开始监听 LifecycleOwner 的生命周期变化?
【发布时间】:2017-06-16 17:28:27
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: android android-lifecycle android-architecture-lifecycle


    【解决方案1】:

    有一个名为LifecycleRuntimeTrojanProviderContentProvider 被合并到应用程序的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 以获取有关活动片段生命周期事件的通知。如果片段是LifecycleRegistryOwner,它会将onFragmentCreatedonFragmentStartedonFragmentResumed 回调传递给LifecycleRegistry,方式与以前相同。

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

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

    【讨论】:

      【解决方案2】:

      正如 Mordag 所说,截至目前,LifecycleActivity 和 LifecycleFragment 都尚未实现。谷歌在他们的文档中说:

      通过实现内置的 LifecycleRegistryOwner 接口(而不是扩展 LifecycleFragment 或 LifecycleActivity),任何自定义片段或活动都可以变成 LifecycleOwner。

      但是,这只是故事的一半,因为您自然而然地使用这些 Lifecycle Aware 组件能够对您的 Activity/Fragment 生命周期做出反应,并且使用它们的代码 sn-p 它只是不起作用,因为初始化 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 的代码中,但在此之前,如果您让您的活动/片段观察某个 LifecycleAware 对象(如 LiveData),您将不得不这样做。

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

      【讨论】:

      • 谢谢你的回答,但不,我不需要做所有这些回调,它现在就可以了。你只需要定义 LifecycleRegistry 并实现 LifecycleOwner
      • 当时我可能误解了你的问题。但我写的基本上是定义一个 LifecycleRegistry,我相信你在观察 LiveData 时会用到它。这不是你要找的吗?
      • Carlos,我正在寻找活动或片段如何将有关更改生命周期的信息发送到 LifecycleRegistry 对象
      • 您能否使用一些代码编辑您的问题,以便更清楚地了解您要做什么?谢谢。
      【解决方案3】:

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

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

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

      支持库中的 Lifecycle Fragment 和 ActivityCompat 不 还实现 LifecycleOwner 接口。他们会在建筑 组件达到 1.0.0 版本。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-07-19
          • 2015-02-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多