Banson's Blog
Android Lifecycle
关于 Android 中 Lifecycle 的基本概念,以及同名库。

Lifecycle 概念

Activity 和 Fragment 的生命周期概念几乎相同,可以用下图简洁地表示。当 activity 或 fragment 的状态切换时,有向边上标注的回调被调用。值得注意的是,当应用首次启动时,会一路到达 Resumed 状态,自然也会调用 onResume 方法。这一点似乎与字面意义不同。

Lifecycle

解释:在界面被完全隐藏时(如:用户通过home键切出应用),onStop 被调用,应用进入 Created。在界面没有被完全隐藏,但失去焦点时(如:来点,或弹窗,等等),onPause 被调用,应用进入 Started。

Lifecycle 库

手动设置应用各个阶段的行为(如开始/停止播放音乐、开始/停止计时器、启动/停止物理引擎模拟等等)未免过于繁琐,且容易出错;采用 Android 提供的 lifecycle 库更为妥当。

观察者模式

观察者模式(observer pattern)是一种设计模式。Observer 负责观察 subject,当 subject 发生变化时,observer 将会做出我们设置好的反应。

Observer Pattern

考虑一个程序运行时间计时器。朴素地,我们可以在 onStart 方法中调用 startTimer 方法启动计时器,在 onStop 方法中调用 stopTimer 停止计时。采用观察者模式,我们将反过来考虑:观察 fragment(or: activity) 的 lifecycle 对象,当其发生改变时,调用 startTimer/stopTimer 方法。观察者模式中,对 lifecycle 做出合理反应的责任被从 fragment(or: activity) 转嫁给 timer。

Observer Example

代码

Timer class 继承 LifecycleObserver class,并提供第一类构造函数。

class Timer(lifecycle: Lifecycle) : LifecycleObserver {
    init {
        lifecycle.addObserver(this)
    }
}

构造 Timer 对象时,传入 activity 的 lifecycle。

var timer = Timer(this.lifecycle)

使用 @OnLifecycleEvent 标记需要在 lifecycle 变化时调用的函数。

@OnLifecycleEvent(Lifecycle.Event.ON_START)
fun startTimer() {...}

@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
fun stopTimer() {...}

Last modified on 2020-07-06