lifecycle的记录
一:继承LifecycleEventObserver
要继承LifecycleEventObserver而不是它的父类,如果既继承它,也继承它的父类(它的父类是LifecycleObserver),那么@OnLifecycleEvent注释会被忽略。
打开方式:
class MyLifeCycle: LifecycleEventObserver { override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) { when(event) { Lifecycle.Event.ON_CREATE -> { Log.d("Jeck", "MyLifeCycle: ON_CREATE") } Lifecycle.Event.ON_START -> { Log.d("Jeck", "MyLifeCycle: ON_START") } Lifecycle.Event.ON_RESUME -> { Log.d("Jeck", "MyLifeCycle: ON_RESUME") } Lifecycle.Event.ON_PAUSE -> { Log.d("Jeck", "MyLifeCycle: ON_PAUSE") } Lifecycle.Event.ON_STOP -> { Log.d("Jeck", "MyLifeCycle: ON_STOP") } Lifecycle.Event.ON_DESTROY -> { Log.d("Jeck", "MyLifeCycle: ON_DESTROY") } Lifecycle.Event.ON_ANY -> { Log.d("Jeck", "MyLifeCycle: ON_ANY") } } } }
和 activity配合操作的话,就在activity的onCreate里面调用:
lifecycle.addObserver(MyLifeCycle())
然后,生命周期的回调行为如下,先打开一个activity,然后退出一个activity
activity: onCreate MyLifeCycle: ON_CREATE
activity: onStart MyLifeCycle: ON_START
activity: onResume MyLifeCycle: ON_RESUME
----------分割线--------- MyLifeCycle: ON_PAUSE activity: onPause
MyLifeCycle: ON_STOP activity: onStop
MyLifeCycle: ON_DESTROY activity: onDestroy
顺序在前后会相反哦~~~~~(原因看第三点源码分析)
二:自己实现一个LifecycleOwner
我想不到什么应用场景,如果要做可以参考ComponentActivity的源码或博客:https://blog.csdn.net/xx326664162/article/details/90749168
三:源码分析
1:添加callback的流程
ComponentActivity实现了LifecycleOwner接口,那么它到底是如何实现在特定生命周期回调自己写的监听器的呢?
1:首先,onCreate时调用了 ReportFragment.injectIfNeededIn(this);
2:LifecycleCallbacks.registerIn(ComponentActivity);
3: ComponentActivity.registerActivityLifecycleCallbacks(new LifecycleCallbacks());
4: ArrayList<ActivityLifecycleCallbacks>.add(callback)
5: 随后,在activity的各个生命周期,执行相应的dispatch方法。回调ActivityLifecycleCallbacks的相应方法。方法有一下那么多:
我想,名字很清晰地表达了意思。
2:类的关系要注意
LifecycleCallbacks 继承 ActivityLifecycleCallbacks。
ActivityLifecycleCallbacks的回调方法可以理解为是标准的,就是那些onPre,onPost都是正正确确地在相应的之前、之后去发生。
但LifecycleCallback继承了父类并重写了相应方法
可以发现,activity进入时的回调重写了Post的,退出时的回调重写了Pre的。重写时把onActivityCreated这些方法的函数体留空了,即不做任何事。然后在Post和Pre时发送了相应的Lifecycle.Event.ON_XXX.
这解释了第一点的奇怪现象。