Jetpeck LifeCycle上手实践demo
一、问题背景
在安卓开发日常中,我们经常有些场景是和activity或者application的生命周期相关的,这部分实现一般我们都会直接写在对应声明周期的方法中,比如写在oncreate函数等等。这样的话代码的耦合性就会比较高,并且这类代码多起来的话就会显得很冗余。这时候我们就可以使用到jetpeck提供的lifecycle组件,使得代码更有条理性、精简、易于维护。
二、问题分析
假设我们有一个在屏幕上显示设备位置的 Activity,实现起来的话可能像下面代码一样:
internal class MyLocationListener(
private val context: Context,
private val callback: (Location) -> Unit) {
fun start() {
// connect to system location service
}
fun stop() {
// disconnect from system location service
}
}
class MyActivity : AppCompatActivity() {
private lateinit var myLocationListener: MyLocationListener
override fun onCreate(...) {
myLocationListener = MyLocationListener(this) { location ->
// update UI
}
}
public override fun onStart() {
super.onStart()
myLocationListener.start()
// manage other components that need to respond
// to the activity lifecycle
}
public override fun onStop() {
super.onStop()
myLocationListener.stop()
// manage other components that need to respond
// to the activity lifecycle
}
}
这个场景就是直接在Activity 或 Fragment 的生命周期方法中直接对组件进行操作。这样写的话会导致代码显得冗余且不易扩展。那么使用Lifecycle,可以将***依赖组件的代码从Activity/Fragment生命周期方法中移入组件本身中。***
三、实现demo
1)对应module的gradle文件添加对应依赖
dependencies {
...
def room_version = "2.4.2"
implementation "androidx.lifecycle:lifecycle-runtime-ktx:$room_version"
...
}
2)定义LifeCycleObserver类
import android.util.Log
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleObserver
import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.OnLifecycleEvent
open class MyLifeCycleObserver : LifecycleObserver {
private val TAG : String = "MyLifeCycleDemoObserver"
@OnLifecycleEvent(value = Lifecycle.Event.ON_START)
fun connect(owner: LifecycleOwner) {
Log.e(TAG, "Lifecycle.Event.ON_CREATE:connect")
}
@OnLifecycleEvent(value = Lifecycle.Event.ON_STOP)
fun disConnect() {
Log.e(TAG, "Lifecycle.Event.ON_DESTROY:disConnect")
}
}
3)在我们的activity中添加自定义的LifeCycleObserver对象
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
class LifeCycleActivity : AppCompatActivity() {
private val TAG : String = "LifeCycleDemoActivity"
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_life_cycle)
Log.d(TAG, "onCreate")
// 添加lifecycle的观察者
lifecycle.addObserver(MyLifeCycleObserver())
}
override fun onStop() {
super.onStop()
Log.d(TAG, "onStop")
}
}
4)进入和退出我们的activity,***测试log***如下:
四、问题总结
使用jetpeck提供的lifecycle可以帮我们把声明周期相关的代码抽取到具体的组件对象中,避免了activity或者application等类的生命周期方法中代码过于冗余和耦合,增强代码之间的隔离和彼此的封装性,便于扩展和修改代码。