生命周期注册表实例何时开始侦听生命周期所有者的生命周期更改?



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

生命周期片段只是创建一个新的生命周期注册表对象,该对象不会开始观察片段的生命周期。

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

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

有一个名为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 以获取有关活动的片段生命周期事件的通知。它以与以前相同的方式将onFragmentCreatedonFragmentStartedonFragmentResumed回调中继到LifecycleRegistry,以防片段是LifecycleRegistryOwner

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

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

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

任何自定义片段或活动都可以通过实现内置的 LifecycleRegistryOwner 接口(而不是扩展生命周期片段或生命周期活动)转换为生命周期所有者。

然而,这只是故事的一半,因为您自然使用这些生命周期感知组件来应对您的活动/片段生命周期,而使用它们的代码片段是行不通的,因为像这样使用活动/片段初始化生命周期注册表

LifecycleRegistry lifecycleRegistry = new LifecycleRegistry(this);

仅获取处于"已初始化"状态的生命周期。

因此,长话短说,为了使其现在(在他们的 1.0 版本之前)工作,您必须实现实现生命周期注册表的活动/片段的生命周期。因此,对于活动/片段的每个回调,您需要执行以下操作:

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);
}

这很可能在未来的生命周期活动和生命周期片段的代码中,但在此之前,如果你把你的活动/片段放在观察一些生命周期感知对象(如LiveData)中,你将不得不这样做。

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

LifecycleFragment 和 LifecycleActivity 目前尚未完全实现。这些类将在 lib 达到 1.0 版本时实现。目前,您可以使用这些生命周期注册表来观察 LiveData 对象。这些对象基于将来的结果,例如可能是数据库中的对象。

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

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

支持库中的生命周期片段和活动兼容性不 但实现生命周期所有者接口。他们会当建筑 组件达到 1.0.0 版本。

生命周期活动、生命周期片段和生命周期注册表所有者接口在 API 级别 1.0.0 中已弃用。 使用 android.support.v7.app.AppCompatActivity 和 android.support.v4.app.Fragment 代替它。 官方文档在这里 生命周期活动生命周期片段

最新更新