我已经开始学习架构组件,但找不到一件事。
LifecycleFragment只是创建了一个新的LifecycleRegistry对象,它不会开始观察片段的生命周期。
我猜 LifecycleRegistry 对象开始监听片段的生命周期,例如,当我们将它作为第一个参数放入LiveData.observe()时,但我在源代码中没有找到任何证据。
问题: LifecycleRegistry对象何时以及如何开始观察片段的生命周期并刷新LifecycleRegistry.mState
?
我已经开始学习架构组件,但找不到一件事。
LifecycleFragment只是创建了一个新的LifecycleRegistry对象,它不会开始观察片段的生命周期。
我猜 LifecycleRegistry 对象开始监听片段的生命周期,例如,当我们将它作为第一个参数放入LiveData.observe()时,但我在源代码中没有找到任何证据。
问题: LifecycleRegistry对象何时以及如何开始观察片段的生命周期并刷新LifecycleRegistry.mState
?
有一个ContentProvider
调用LifecycleRuntimeTrojanProvider
被合并到应用程序的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);
}
}
如果新活动是 a FragmentActivity
,则LifecycleDispatcher
调用FragmentManager.registerFragmentLifecycleCallbacks以获取有关活动片段生命周期事件的通知。如果片段是 a ,它会以与以前相同的方式将onFragmentCreated
,onFragmentStarted
和onFragmentResumed
回调传递给。LifecycleRegistry
LifecycleRegistryOwner
、和回调在片段上调用相应的回调之后调用,但onFragmentPaused
回调必须在之前调用。因此,每当创建片段时,都会将 的实例注入其中。的生命周期回调用于为暂停、停止和销毁事件更新注册表。onFragmentStopped
onFragmentDestroyed
LifecycleObserver
LifecycleDispatcher
LifecycleDispatcher.DestructionReportFragment
DestructionReportFragment
我无法链接到代码,因为它尚未发布,但您可以在将库添加到项目后在 Android Studio 中浏览它。
正如 Mordag 所说,截至目前,LifecycleActivity 和 LifecycleFragment 都还没有实现。谷歌在他们的文档中说:
通过实现内置的 LifecycleRegistryOwner 接口(而不是扩展 LifecycleFragment 或 LifecycleActivity),任何自定义的 Fragment 或 Activity 都可以变成 LifecycleOwner。
然而,这只是故事的一半,因为您自然而然地使用这些 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 的代码中,但在此之前,如果你让你的活动/片段观察一些 LifecycleAware 对象(如 LiveData),你将不得不这样做。
在 LiveData 的情况下,因为它不会通知其观察者,除非它们至少处于 STARTED 状态,而在其他情况下,因为如果 Lifecycle 的唯一状态是 INITIALIZED,其他 LifecycleAware 组件无法对 Lifecycle 做出反应。
LifecycleFragment 和 LifecycleActivity 目前还没有完全实现。这些类将在 lib 达到 1.0-release 时实现。目前您可以使用这些 LifecycleRegistry 来观察 LiveData 对象。这些对象基于未来的结果,例如可能是您数据库中的对象。
官方文档可以在这里找到:https ://developer.android.com/topic/libraries/architecture/index.html
关于你提到的两个类的官方声明:
Support Library 中的 Lifecycle Fragment 和 ActivityCompat 还没有实现 LifecycleOwner 接口。他们会在架构组件达到 1.0.0 版本时。
LifecycleActivity 、LifecycleFragment 和 LifecycleRegistryOwner 接口在 API 级别 1.0.0 中已弃用。使用 android.support.v7.app.AppCompatActivity 和 android.support.v4.app.Fragment 代替它。官方文档在这里LifecycleActivity LifeCycleFragment