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

时间:2017-06-16 17:28:27

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

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

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

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

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

4 个答案:

答案 0 :(得分:5)

有一个名为ContentProvider的{​​{1}}已合并到应用的LifecycleRuntimeTrojanProvider中。在AndroidManifest.xml方法中,它初始化了一个名为onCreate的单例,它负责更新所有LifecycleDispatcher个实例。

LifecycleRegistry使用自API 14以来一直存在的Application.registerActivityLifecycleCallbacks方法,以便在创建新活动时收到通知。此时,它会在活动中注入LifecycleDispatcher的实例。如有必要,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会调用FragmentManager.registerFragmentLifecycleCallbacks以获取活动片段生命周期事件的通知。它会将LifecycleDispatcheronFragmentCreatedonFragmentStarted回调转发给onFragmentResumed,以防片段为LifecycleRegistry,其方式与之前相同。

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

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

答案 1 :(得分:4)

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

  

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

然而,这只是故事的一半,因为您自然使用这些生命周期感知组件能够对您的活动/片段生命周期作出反应,并且使用它们的代码片段它只是不起作用,因为初始化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状态,而在其他情况下,因为如果其唯一状态为INITIALIZED,则其他LifecycleAware组件无法对生命周期作出反应。

答案 2 :(得分:-1)

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

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

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

  

支持库中的生命周期片段和ActivityCompat不会   然后实现LifecycleOwner接口。他们将在建筑时   组件达到1.0.0版本。

答案 3 :(得分:-1)

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