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。
有一个名为 LifecycleRuntimeTrojanProvider
的 ContentProvider
已合并到应用程序的 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 是 FragmentActivity
,LifecycleDispatcher
调用 FragmentManager.registerFragmentLifecycleCallbacks 以获取 activity 片段生命周期事件的通知。它会将 onFragmentCreated
、onFragmentStarted
和 onFragmentResumed
回调中继到 LifecycleRegistry
,以防片段是 LifecycleRegistryOwner
,方法与之前相同。
onFragmentPaused
、onFragmentStopped
、onFragmentDestroyed
回调在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
我已经开始学习架构组件,但找不到任何东西。
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。
有一个名为 LifecycleRuntimeTrojanProvider
的 ContentProvider
已合并到应用程序的 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 是 FragmentActivity
,LifecycleDispatcher
调用 FragmentManager.registerFragmentLifecycleCallbacks 以获取 activity 片段生命周期事件的通知。它会将 onFragmentCreated
、onFragmentStarted
和 onFragmentResumed
回调中继到 LifecycleRegistry
,以防片段是 LifecycleRegistryOwner
,方法与之前相同。
onFragmentPaused
、onFragmentStopped
、onFragmentDestroyed
回调在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