Jetpack Lifecycle

Lifecycle 是 Android Jetpack 框架提供的能够感知宿主组件生命周期变化的组件,它能持有宿主(如 Activity 或 Fragment)生命周期状态的信息,并且允许其他观察者注册监听宿主的生命周期状态变化。这就使得我们不用主动去获取宿主的状态,有利于降低代码耦合度并更容易维护 。

Lifecycle 可以让组件自己管理生命周期的逻辑,避免每次调用时的繁琐步骤,用 Lifecycle 实现的组件可以实现生命周期的监听,数据变化的监听等功能 ⁵。

依赖

Lifecycle 组件已集成到 AndroidX 中,无需添加额外依赖即可使用,可以在使用 AndroidX 的项目中直接访问相关的 API 。

使用

Lifecycle 有两种使用方式,第一种是通过继承 DefaultLifecycleObserver 可以拓展自己与生命周期相关的业务逻辑,下面是个例子:

class TestLifeCycleObserver: DefaultLifecycleObserver {
    override fun onStart(owner: LifecycleOwner) {
        super.onStart(owner)
        Log.i(this.javaClass.simpleName, "onStart")
    }









    override fun onStop(owner: LifecycleOwner) {
        super.onStop(owner)
        Log.i(this.javaClass.simpleName, "onStop")
    }


}

另一种方式是通过继承 LifecycleEventObserver 监听生命周期变化:

class TestLifeCycleObserver() : LifecycleEventObserver {
    override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) {
        Log.i(this.javaClass.simpleName, "source: $source, event: $event")
    }

}

定义好 LifecycleObserver 的实现类后,在一个具有生命周期的容器组件中,通过 getLifecycle() 方法获取 Lifecycle 对象,通过该对象的 addObserver 和 removeObserver 方法来管理观察者。下面是个例子:

在具有生命周期的组件中例如 Activity 或 Fragment 添加监听:

class LifeCycleActivity : AppCompatActivity() {


    private val observer = TestLifeCycleObserver()





    private lateinit var binding: ActivityLifeCycleBinding






    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityLifeCycleBinding.inflate(layoutInflater)
        setContentView(binding.root)
        lifecycle.addObserver(observer)
    }




    override fun onDestroy() {
        super.onDestroy()
        lifecycle.removeObserver(observer)
    }
}

在上面的例子中,TestLifeCycleObserver 对象在 Activity 的 onCreate 中添加监听,onDestroy 中释放监听。这样 observer 依然能够接收到 onCreate 和 onDestroy 的回调。修改 TestLifeCycleObserver :

 class TestLifeCycleObserver: DefaultLifecycleObserver {
    override fun onCreate(owner: LifecycleOwner) {

        super.onCreate(owner)

        Log.i(this.javaClass.simpleName, “onCreate”)
    }









    override fun onStart(owner: LifecycleOwner) {

        super.onStart(owner)

        Log.i(this.javaClass.simpleName, “onStart”)
    }




    override fun onStop(owner: LifecycleOwner) {

        super.onStop(owner)

        Log.i(this.javaClass.simpleName, “onStop”)
    }





    override fun onDestroy(owner: LifecycleOwner) {

        super.onDestroy(owner)

        Log.i(this.javaClass.simpleName, “onDestroy”)
    }


}

操作打开 LifeCycleActivity 并退出后,收到的日志为:

2023-06-15 14:58:09.006 TestLifeCycleObserver           I  onCreate
2023-06-15 14:58:09.010 TestLifeCycleObserver           I  onStart
2023-06-15 14:58:12.423 TestLifeCycleObserver           I  onStop
2023-06-15 14:58:12.425 TestLifeCycleObserver           I  onDestroy

源码分析

LifeCycleObserver

LifecycleObserver 是一个空的接口:

public interface LifecycleObserver {}

用来标记一个类具有生命周期能力,不能直接使用 LifecycleObserver ,而是通过实现 DefaultLifecycleObserver 或 LifecycleEventObserver 来接收生命周期事件。

FullLifecycleObserver 和 DefaultLifecycleObserver

上面的例子使用的是 DefaultLifecycleObserver ,它并没有直接继承自 LifecycleObserver , 而是继承自 FullLifecycleObserver ,在这个接口中,定义了对应 Activity 生命周期的各个方法。

interface FullLifecycleObserver extends LifecycleObserver {


    void onCreate(LifecycleOwner owner);





    void onStart(LifecycleOwner owner);






    void onResume(LifecycleOwner owner);

    void onPause(LifecycleOwner owner);


    void onStop(LifecycleOwner owner);

    void onDestroy(LifecycleOwner owner);
}

DefaultLifecycleObserver 实现 FullLifecycleObserver 接口并没有提供什么额外能力,只是提供了默认空实现,用于监听 LifecycleOwner 状态变化。

public interface DefaultLifecycleObserver extends FullLifecycleObserver {
    @Override
    default void onCreate(@NonNull LifecycleOwner owner) {}





    @Override
    default void onStart(@NonNull LifecycleOwner owner) {}

    @Override
    default void onResume(@NonNull LifecycleOwner owner) {}


    @Override
    default void onPause(@NonNull LifecycleOwner owner) {}



    @Override
    default void onStop(@NonNull LifecycleOwner owner) {}



    @Override
    default void onDestroy(@NonNull LifecycleOwner owner) {}
}

需要注意的是,如果一个类同时实现了 DefaultLifecycleObserver 和 LifecycleEventObserver ,DefaultLifecycleObserver 的方法会优先调用,然后遵循 LifecycleEventObserver.onStateChanged(LifecycleOwner, Lifecycle.Event) 的回调顺序。

如果一个类实现了 DefaultLifecycleObserver 并同时使用 OnLifecycleEvent ,OnLifecycleEvent 注解将会被忽略。

OnLifecycleEvent

这是一个注解类,用于标记 LifecycleObserver 实现的方法,这些方法用于处理生命周期事件。
不推荐使用该注解,这个注解需要使用代码生成或反射,应该避免使用。尽量使用 DefaultLifecycleObserver 或 LifecycleEventObserver 替代。

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Deprecated
public @interface OnLifecycleEvent {
    Lifecycle.Event value();
}

LifecycleEventObserver

LifecycleEventObserver 用于接收生命周期变化并派发给接收者。如果一个类同时实现了 DefaultLifecycleObserver ,DefaultLifecycleObserver 的方法将优先调用, onStateChanged 会在后续调用。

public interface LifecycleEventObserver extends LifecycleObserver {
    void onStateChanged(@NonNull LifecycleOwner source, @NonNull Lifecycle.Event event);
}

需要注意的是,当一个类同时实现 DefaultLifecycleObserver 和 LifecycleEventObserver 时,打印顺序是 DefaultLifecycleObserver 的方法优先调用,LifecycleEventObserver 次之。
而如果两个类各自实现,打印顺序不遵循 DefaultLifecycleObserver 优先的规则。而是遵循 lifecycle.addObserver 方法的添加顺序执行回调的。

举例说明,下面是一个同时实现两者的方法:

class TestLifeCycleObserver: DefaultLifecycleObserver, LifecycleEventObserver {
    override fun onCreate(owner: LifecycleOwner) {

        super.onCreate(owner)

        Log.i(this.javaClass.simpleName, "onCreate")
    }









    override fun onStart(owner: LifecycleOwner) {

        super.onStart(owner)

        Log.i(this.javaClass.simpleName, "onStart")
    }




    override fun onStop(owner: LifecycleOwner) {

        super.onStop(owner)

        Log.i(this.javaClass.simpleName, "onStop")
    }





    override fun onDestroy(owner: LifecycleOwner) {

        super.onDestroy(owner)

        Log.i(this.javaClass.simpleName, "onDestroy")
    }




    override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) {
        Log.i(this.javaClass.simpleName, "source: $source, event: $event")
    }

}

当生命周期变化时,它的打印如下:

TestLifeCycleObserver           I  onCreate

TestLifeCycleObserver           I  source: com.chunyu.demo.lifecycle.LifeCycleActivity@a56a12e, event: ON_CREATE
TestLifeCycleObserver           I  onStart

TestLifeCycleObserver           I  source: com.chunyu.demo.lifecycle.LifeCycleActivity@a56a12e, event: ON_START
...

而如果分别创建一个类,这里用前面的 TestLifeCycleObserver 和 TestLifeCycleObserver2 为例,在 Activity 中的添加顺序:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    binding = ActivityLifeCycleBinding.inflate(layoutInflater)
    setContentView(binding.root)
    lifecycle.addObserver(observer1) // TestLifeCycleObserver
    lifecycle.addObserver(observer2) // TestLifeCycleObserver2
}

打印结果:

TestLifeCycleObserver           I  onCreate

TestLifeCycleObserver2          I  source: com.chunyu.demo.lifecycle.LifeCycleActivity@392d4cf, event: ON_CREATE
TestLifeCycleObserver           I  onStart

TestLifeCycleObserver2          I  source: com.chunyu.demo.lifecycle.LifeCycleActivity@392d4cf, event: ON_START

改变顺序为:

lifecycle.addObserver(observer2) // TestLifeCycleObserver2
lifecycle.addObserver(observer1) // TestLifeCycleObserver

打印结果为:

TestLifeCycleObserver2          I  source: com.chunyu.demo.lifecycle.LifeCycleActivity@a56a12e, event: ON_CREATE
TestLifeCycleObserver           I  onCreate
TestLifeCycleObserver2          I  source: com.chunyu.demo.lifecycle.LifeCycleActivity@a56a12e, event: ON_START
TestLifeCycleObserver           I  onStart

LifecycleOwner

在上面的例子中经常出现一个类型 LifecycleOwner , 实现该接口的类具有 Android 生命周期的能力,需要提供生命周期事件。
这些事件可以被自定义组件用来处理生命周期变化,而不需要在 Activity 或 Fragment 中实现任何代码。

public interface LifecycleOwner {
    @NonNull
    Lifecycle getLifecycle();
}

AndroidX 中的 AppCompatActivity 的继承关系中,由 ComponentActivity 实现了 LifecycleOwner 接口:

// in ComponentActivity
private final LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this);

@NonNull
@Override
public Lifecycle getLifecycle() {
    return mLifecycleRegistry;
}

在 的无参构造方法中调用了 getLifecycle 方法获取 Lifecycle 对象,并添加了一些监听:

public ComponentActivity() {
    Lifecycle lifecycle = getLifecycle();
    if (lifecycle == null) {
        throw new IllegalStateException("getLifecycle() returned null in ComponentActivity");
    }



    // ...
    getLifecycle().addObserver(new LifecycleEventObserver() {
        @Override
        public void onStateChanged(@NonNull LifecycleOwner source,
                @NonNull Lifecycle.Event event) {
            if (event == Lifecycle.Event.ON_DESTROY) {
                // Clear out the available context
                mContextAwareHelper.clearAvailableContext();
                // And clear the ViewModelStore
                if (!isChangingConfigurations()) {
                    getViewModelStore().clear();
                }
            }
        }
    });
    getLifecycle().addObserver(new LifecycleEventObserver() {
        @Override
        public void onStateChanged(@NonNull LifecycleOwner source,
                @NonNull Lifecycle.Event event) {
            ensureViewModelStore();
            getLifecycle().removeObserver(this);
        }
    });
    // ...
}

这里简化了一些代码,核心逻辑是获取一个 LifeCycle 对象,添加了一些监听,这些监听主要用于处理 ViewModelStore ,这也说明在 AndroidX 下默认提供了 Lifecycle 配合 ViewModel 框架的支持。

LifecycleOwner 的另一个实现是 androidx.fragment.app.Fragment 。也是创建了一个 LifecycleRegistry 对象。

Lifecycle

Lifecycle 是一个抽象类,定义了一个拥有 Android 生命周期的对象。Fragment 和 FragmentActivity 类实现了 LifecycleOwner 接口,它有 getLifecycle 方法来访问 Lifecycle。你也可以在自己的类中实现 LifecycleOwner。

在这个类中,
Lifecycle.Event.ON_CREATE、Lifecycle.Event.ON_START、Lifecycle.Event.ON_RESUME 事件是在 LifecycleOwner 的相关方法返回后调用的。

Lifecycle.Event.ON_PAUSE、Lifecycle.Event.ON_STOP、Lifecycle.Event.ON_DESTROY 事件是在调用 LifecycleOwner 的相关方法之前调用的。

例如,Lifecycle.Event.ON_START 将在 onStart 返回后调用,Lifecycle.Event.ON_STOP 将在调用 onStop 之前调用。这为你提供了关于拥有者所处状态的某些保证。

这就解释了为什么我们在 Activity 的 onCreate 添加监听,仍然能够收到 Lifecycle.Event.ON_CREATE 事件,因为 LifecycleObserver 的调用是在 Activity 的 onCreate 方法返回后调用的。

Lifecycle 中定义了生命周期的事件类型:

public enum Event {

    ON_CREATE,
    ON_START,
    ON_RESUME,
    ON_PAUSE,
    ON_STOP,
    ON_DESTROY,
    ON_ANY;
}

状态:

public enum Event {

    DESTROYED,
    INITIALIZED,
    CREATED,
    STARTED,
    RESUMED;
}

对应的状态含义是:

  • DESTROYED:LifecycleOwner 的销毁状态。在这个事件之后,这个 Lifecycle 将不再分派任何事件。例如,对于一个 Activity,这个状态是在 Activity 的 onDestroy 调用之前达到的。
  • INITIALIZED:LifecycleOwner 的初始化状态。对于一个 Activity,这是它被构造但尚未收到 onCreate 调用时的状态。
  • CREATED:LifecycleOwner 的创建状态。对于一个 Activity,这个状态会在两种情况下达到:
    • onCreate 调用后
    • onStop 调用前
  • STARTED:LifecycleOwner 的开始状态。对于一个 Activity,这个状态会在两种情况下达到:
    • onStart 调用后
    • onPause 调用前
  • RESUMED:LifecycleOwner 的开始状态。对于一个 Activity,这个状态会在 onResume 方法调用后到达。
    这样整体顺序就是下面的流程:

64921A2B-DB60-4A61-AAA7-E60C56FEE54F.png

LifecycleRegistry

在前面 LifecycleOwner 中的实现类中都是通过 LifecycleRegistry 来作为返回的 Lifecycle 对象的,LifecycleRegistry 是 Lifecycle 的实现,能够处理多个监听。

public LifecycleRegistry(@NonNull LifecycleOwner provider) {
    this(provider, true);
}






private LifecycleRegistry(@NonNull LifecycleOwner provider, boolean enforceMainThread) {
    mLifecycleOwner = new WeakReference<>(provider);
    mState = INITIALIZED;
    mEnforceMainThread = enforceMainThread;
}

构造方法中需要传递一个 LifecycleOwner 参数,内部持有这个对象的弱引用。设置默认状态为初始化状态 INITIALIZED , 默认启用强制主线程。

一般情况下我们获取 Lifecycle 后主要方法是 addObserver 和 removeObserver ,所以本文只关注这两个核心逻辑。

addObserver

addObserver 方法用于添加监听:

public void addObserver(@NonNull LifecycleObserver observer) {
    enforceMainThreadIfNeeded("addObserver");
    State initialState = mState == DESTROYED ? DESTROYED : INITIALIZED;
    ObserverWithState statefulObserver = new ObserverWithState(observer, initialState);
    ObserverWithState previous = mObserverMap.putIfAbsent(observer, statefulObserver);






    if (previous != null) {
        return;
    }
    LifecycleOwner lifecycleOwner = mLifecycleOwner.get();
    if (lifecycleOwner == null) {
        // it is null we should be destroyed. Fallback quickly
        return;
    }

    boolean isReentrance = mAddingObserverCounter != 0 || mHandlingEvent;
    State targetState = calculateTargetState(observer);
    mAddingObserverCounter++;
    while ((statefulObserver.mState.compareTo(targetState) < 0
            && mObserverMap.contains(observer))) {
        pushParentState(statefulObserver.mState);
        final Event event = Event.upFrom(statefulObserver.mState);
        if (event == null) {
            throw new IllegalStateException("no event up from " + statefulObserver.mState);
        }
        statefulObserver.dispatchEvent(lifecycleOwner, event);
        popParentState();
        // mState / subling may have been changed recalculate
        targetState = calculateTargetState(observer);
    }

    if (!isReentrance) {
        // we do sync only on the top level.
        sync();
    }
    mAddingObserverCounter--;
}

这个方法用于将一个 LifecycleObserver 对象添加到观察者列表中。方法首先检查当前线程是否为主线程,然后创建一个 ObserverWithState 对象来存储观察者和其初始状态。接着,它会尝试将这个 ObserverWithState 对象添加到 mObserverMap 中。如果添加成功,它会计算目标状态并在 while 循环中分派事件,直到观察者的状态达到目标状态。最后,如果当前不是在处理事件或添加观察者,它会调用 sync 方法来同步状态。

FastSafeIterableMap

LifecycleObserver 对象保存到了 mObserverMap 中, 类型是 FastSafeIterableMap ,这是一个自定义列表,用于保存观察者,并能够在遍历过程中处理删除/添加。它是一个类似于 LinkedHashMap 的数据结构,它支持在迭代过程中进行修改。它比 SafeIterableMap 占用更多的内存,并且不是线程安全的。

ObserverWithState

ObserverWithState 对象用来存储观察者和其初始状态,内部使用到了 LifecycleEventObserver 来发出通知:

static class ObserverWithState {
    State mState;
    LifecycleEventObserver mLifecycleObserver;





    ObserverWithState(LifecycleObserver observer, State initialState) {
        mLifecycleObserver = Lifecycling.lifecycleEventObserver(observer);
        mState = initialState;
    }



    void dispatchEvent(LifecycleOwner owner, Event event) {
        State newState = event.getTargetState();
        mState = min(mState, newState);
        mLifecycleObserver.onStateChanged(owner, event);
        mState = newState;
    }


}

其中 dispatchEvent 方法做了状态的顺序校验,并且通过 LifecycleEventObserver 发送事件更新。

removeObserver

public void removeObserver(@NonNull LifecycleObserver observer) {
    enforceMainThreadIfNeeded("removeObserver");
    // we consciously decided not to send destruction events here in opposition to addObserver.
    // Our reasons for that:
    // 1. These events haven't yet happened at all. In contrast to events in addObservers, that
    // actually occurred but earlier.
    // 2. There are cases when removeObserver happens as a consequence of some kind of fatal
    // event. If removeObserver method sends destruction events, then a clean up routine becomes
    // more cumbersome. More specific example of that is: your LifecycleObserver listens for
    // a web connection, in the usual routine in OnStop method you report to a server that a
    // session has just ended and you close the connection. Now let's assume now that you
    // lost an internet and as a result you removed this observer. If you get destruction
    // events in removeObserver, you should have a special case in your onStop method that
    // checks if your web connection died and you shouldn't try to report anything to a server.
    mObserverMap.remove(observer);
}

这个方法用于从观察者列表中移除一个 LifecycleObserver 对象。方法首先检查当前线程是否为主线程,然后从 mObserverMap 中移除指定的观察者。与 addObserver 方法不同,这个方法不会发送销毁事件。这是一个有意识的决定,原因是这些事件还没有发生,而且在某些情况下,removeObserver 可能是由于某种致命事件而发生的。如果 removeObserver 方法发送销毁事件,那么清理过程会变得更加复杂。

Application 生命周期监听

在 Application 中可以调用 registerActivityLifecycleCallbacks(ActivityLifecycleCallbacks) 方法,在这里可以监控整个 App 的 Activity 生命周期变化情况。
通过该接口,可以实现应用前后台切换的监控。

application.registerActivityLifecycleCallbacks(object : ActivityLifecycleCallbacks {
    override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {
        TODO("Not yet implemented")
    }


    override fun onActivityStarted(activity: Activity) {
        TODO("Not yet implemented")
    }



    override fun onActivityResumed(activity: Activity) {
        TODO("Not yet implemented")
    }




    override fun onActivityPaused(activity: Activity) {
        TODO("Not yet implemented")
    }

    override fun onActivityStopped(activity: Activity) {
        TODO("Not yet implemented")
    }




    override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) {
        TODO("Not yet implemented")
    }


    override fun onActivityDestroyed(activity: Activity) {
        TODO("Not yet implemented")
    }
})

© 版权声明
THE END
喜欢就支持一下吧
点赞0

Warning: mysqli_query(): (HY000/3): Error writing file '/tmp/MYBGpFDb' (Errcode: 28 - No space left on device) in /www/wwwroot/583.cn/wp-includes/class-wpdb.php on line 2345
admin的头像-五八三
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

图形验证码
取消
昵称代码图片