Android Jetpack架构之Lifecycle
一、Lifecycle是什么?
Lifecycle生命周期感知组件,可执行操作响应另一个组件(Activity或者Fragment)的生命周期状态。
二、Lifecycle出现的背景
用于解耦系统组件与其它组件的生命周期。
三、示例
App中都有开屏广告,在开屏广告右上角一个倒计时功能。倒计时功能需要和App进入后台暂停,进入前台继续的。
在没有Lifecycle之前,代码实现:
RCountDownTimeView实现
class RCountDownTimeView constructor(context: Context, attrs: AttributeSet?) : androidx.appcompat.widget.AppCompatTextView(context, attrs) { private var _handler: Handler? = null private var _countDownRunnable: Runnable? = null private var _seconds: Int = 5 init { _handler = Handler(Looper.getMainLooper()) } private fun startCountDown() { if (_seconds <= 0) { stopCountDown() return } _countDownRunnable = Runnable { this.text = "${--_seconds}" startCountDown() } _countDownRunnable?.let { _handler?.postDelayed(it, 1000) } } private fun stopCountDown() { _countDownRunnable?.let { _handler?.removeCallbacks(it) } _countDownRunnable = null } fun setStartTime(seconds: Int) { _seconds = seconds } fun start() { startCountDown() } fun pause() { stopCountDown() } fun cancel() { stopCountDown() _handler?.removeCallbacksAndMessages(null)
_handler = null
} }
Activity实现:
class MainActivity : AppCompatActivity() { private val _countDownTime: RCountDownTimeView by lazy { countDownTime } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) _countDownTime.setStartTime(10) } override fun onResume() { super.onResume() _countDownTime.start() } override fun onPause() { super.onPause() _countDownTime.pause() } override fun onDestroy() { super.onDestroy() _countDownTime.cancel() } }
从上面例子可以看出,倒计时组件与Activity组件生命周期耦合严重。
使用Lifecycle后,实现:
RCountDownTimeView实现
class RCountDownTimeView constructor(context: Context, attrs: AttributeSet?) : androidx.appcompat.widget.AppCompatTextView(context, attrs), LifecycleObserver { private var _handler: Handler? = null private var _countDownRunnable: Runnable? = null private var _seconds: Int = 5 init { _handler = Handler(Looper.getMainLooper()) } private fun startCountDown() { if (_seconds <= 0) { stopCountDown() return } _countDownRunnable = Runnable { this.text = "${--_seconds}" startCountDown() } _countDownRunnable?.let { _handler?.postDelayed(it, 1000) } } private fun stopCountDown() { _countDownRunnable?.let { _handler?.removeCallbacks(it) } _countDownRunnable = null } fun setStartTime(seconds: Int) { _seconds = seconds } @OnLifecycleEvent(Lifecycle.Event.ON_RESUME) fun start() { startCountDown() } @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE) fun pause() { stopCountDown() } @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY) fun cancel() { stopCountDown() _handler?.removeCallbacksAndMessages(null) } }
Activity实现:
class MainActivity : AppCompatActivity() { private val _countDownTime: RCountDownTimeView by lazy { countDownTime } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) lifecycle.addObserver(_countDownTime) _countDownTime.setStartTime(10) } override fun onDestroy() { super.onDestroy() lifecycle.removeObserver(_countDownTime) } }
在使用LifeCycle后,与系统组件Activity耦合降低,代码出更简洁。