我已经开始学习架构组件,但找不到一件事。
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);
}
}
如果新活动是FragmentActivity
,LifecycleDispatcher
会调用FragmentManager.registerFragmentLifecycleCallbacks来获取活动片段生命周期事件的通知。它将onFragmentCreated
,onFragmentStarted
和onFragmentResumed
回调传递给LifecycleRegistry
,以防该片段是LifecycleRegistryOwner
,就像以前一样。
在对片段调用相应的回调之后调用onFragmentPaused
,onFragmentStopped
和onFragmentDestroyed
回调,但之前必须调用LifecycleObserver
回调。因此,无论何时创建片段,LifecycleDispatcher
都会向其中注入一个LifecycleDispatcher.DestructionReportFragment
实例。 DestructionReportFragment
的生命周期回调用于更新注册表以暂停,停止和销毁事件。
我无法链接到代码,因为它尚未发布,但您可以在将库添加到项目后在Android Studio中浏览它。
正如Mordag所说,截至目前,LifecycleActivity和LifecycleFragment尚未实现。谷歌在其文档中说:
通过实现内置的LifecycleRegistryOwner接口(而不是扩展LifecycleFragment或LifecycleActivity),可以将任何自定义片段或活动转换为LifecycleOwner。
但是,这只是故事的一半,因为您自然使用这些生命周期感知组件能够对您的活动/片段生命周期做出反应,并且使用它们的代码片段它只是不起作用,因为使用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状态,而在其他情况下,因为如果其唯一状态为INITIALIZED,则其他LifecycleAware组件无法对生命周期做出反应。
LifecycleFragment和LifecycleActivity目前尚未完全实现。当lib达到1.0版本时,将实现这些类。目前,您可以使用这些LifecycleRegistry来观察LiveData对象。这些对象基于未来的结果,例如,是您数据库中的对象。
官方文档可以在这里找到:https://developer.android.com/topic/libraries/architecture/index.html
关于你提到的两个班级的官方声明:
支持库中的生命周期片段和ActivityCompat尚未实现LifecycleOwner接口。当Architecture Components达到1.0.0版本时,它们将会出现。
LifecycleActivity,LifecycleFragment和LifecycleRegistryOwner接口在API级别1.0.0中已弃用。使用android.support.v7.app.AppCompatActivity和android.support.v4.app.Fragment代替它。官方文件在这里LifecycleActivity LifeCycleFragment