为什么不直接使用ActivityLifecycleCallbacks而是使用一个non-UI fragment ReportFragment

因为在”创建”生命周期方法中(onCreate,onStart),ActivityLifecycleCallbacks中方法调用是在Activity的生命周期方法之前。在”销毁”生命周期方法中(onStop,onDestroy),ActivityLifecycleCallbacks中方法调用是在Activity的生命周期方法之后。正常去订阅这里的生命周期,例如

1
2
3
4
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
public void ON_CREATE() {
Log.e(MyObserver, "ON_CREATE");
}

更多的希望是在ActivityonCreate执行完成之后,而订阅Lifecycle.Event.ON_DESTROY则更希望在ActivityonDestroy之前。所有在ActivityLifecycleCallbacks中直接分发生命周期是不合适的。还要注意一下,在注册ReportFragment时候使用的是manager.executePendingTransactions();而不是常见的commit,是为了马上执行,更准确的去分发生命周期。通过这种方式,最终的生命周期类似

1
2
3
4
//创建时
ActivityLifecycleCallbacks.onActivityCreated->Activity.onCreate->ReportFragment.onActivityCreated->LifecycleObserver.ON_CREATE
//销毁时
ReportFragment.onDestroy->LifecycleObserver.ON_DESTROY->Activity.onDestroy->ActivityLifecycleCallbacks.onActivityDestroyed

上面是在LifecycleActivity中使用getLifecycle().addObserver的生命周期分发走向。
同理,在LifecycleFragmentgetLifecycle().addObserver时, FragmentCallbackDestructionReportFragment也是完成类似上面ActivityLifecycleCallbacksReportFragment的工作。总结就是将LifecycleObserver的生命周期进一步限制在跟踪的LifecycleRegistryOwner生命周期范围之内。

ProcessLifecycleOwner的作用?

LifecycleRuntimeTrojanProvider中有两个类进行了初始化,

1
2
LifecycleDispatcher.init(getContext());
ProcessLifecycleOwner.init(getContext());

第一个是为每个组件进行生命周期分发,例如Activity,FragmentProcessLifecycleOwner则是为整个app进程的生命周期进行分发,例如使用ProcessLifecycleOwner.get().getLifecycle().addObserver();就可以监控整个进程的生命周期。注意一点,在销毁时,最多只会分发到ON_STOP,而没有ON_DESTROY事件。

更多分析可以看这篇 Lifecycle-aware Components 源码分析