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.

这解释了第一点的奇怪现象。

posted @ 2022-03-11 23:50  ou尼酱~~~  阅读(67)  评论(0编辑  收藏  举报