
在软件开发当中,解耦可能是永恒的话题。Android开发当中的解耦体现在系统组件
的生命周期和普通组件
之间的解耦,LifeCycle
组件可以帮助我们做到。这篇文章就来分享关于LifeCycle
的知识,希望对看文章的小伙伴有所启发。
LifeCycle作用
- 帮助开发者创建可感知生命周期的组件;
- 组件能够在它的内部管理自己的生命周期,降低模块之间的耦合度;
- 降低内存泄漏发生的可能性;
-
LifeCycle
对Activity
、Fragment
、Service
、Application
都有用。
LifeCycle的原理
Jetpack为我们提供了两个类:
-
LifecycleOwner
,被观察者; -
LifecycleObserver
,观察者。
就是通过这两个类来实现对页面的生命周期的监听。Activity
默认实现了LifecycleOwner
的接口,我们可以通过getLifecycle
方法来实现观察者模式。
如果我们希望监听Activity
的生命周期的时候,我们让自定义组件实现LifecycleObserver
接口就可以了。
使用LifeCycle解耦页面与组件
假设我们监听用户的地理位置,想通过LifeCycle
来做页面和组件的解耦,我们直接看代码示例:
1.创建一个OnLocationListener
类,实现LifecycleObserver
接口。重点是组件通知生命周期的变化,我们就要在方法
上使用@OnLifecycleEvent(Lifecycle.Event.ON_XXX)
标签进行标识。
import android.app.Activity
import android.util.Log
import androidx.lifecycle.LifecycleObserver
import androidx.lifecycle.OnLifecycleEvent
import androidx.lifecycle.Lifecycle
class LocationListener(activity: Activity, var onLocationChangedListener: OnLocationChangedListener) :
LifecycleObserver {
/**
* 当Activity执行onResume()方法时,该方法会自动调用
*/
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
private fun startGetLocation() {
Log.d("TAG", "startGetLocation()")
}
/**
* 当Activity执行onPause()方法时,该方法会自动调用
*/
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
private fun stopGetLocation() {
Log.d("TAG", "stopGetLocation()")
}
interface OnLocationChangedListener {
fun onChanged(latitude: Double, longitude: Double)
}
private fun initLocationManager() {
// 初始化相关的定位管理器
}
init {
// 初始化操作
initLocationManager()
}
}
2.在MainActivity
中调用,通过getLifecycle().addObserver()
方法,将观察者与被观察者绑定起来:
class MainActivity : AppCompatActivity(R.layout.activity_main) {
@SuppressLint("UseCompatLoadingForDrawables")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
lifecycle.addObserver(LocationListener(this,object :LocationListener.OnLocationChangedListener{
override fun onChanged(latitude: Double, longitude: Double) {
// 获取相关的信息
}
}))
}
}
Fragment
也是同理使用。
网友评论