Android Jetpack 之 Lifecycle
参考文章:“终于懂了“系列:Jetpack AAC完整解析(一)Lifecycle 完全掌握!
参考文章:谷歌Lifecycle文档
0 Jetpack
- 遵循最佳做法,Android Jetpack 组件采用最新的设计方法构建,具有向后兼容性,可以减少崩溃和内存泄露。
- 消除样板代码,Android Jetpack 可以管理各种繁琐的 Activity(如后台任务、导航和生命周期管理),以便您可以专注于打造出色的应用。
- 减少不一致,这些库可在各种 Android 版本和设备中以一致的方式运作,助您降低复杂性。
1 简介
Lifecycle提供了可用于构建生命周期感知型组件的类和接口,用于帮助开发者管理Activity和Fragment 的生命周期
2 接入
AndroidX中build.gradle中添加依赖:
implementation 'androidx.appcompat:appcompat:1.2.0'
3 使用方法
Lifecycle的使用很简单:
- 先实现生命周期观察者LifecycleObserver接口,方法上使用OnLifecycleEvent注解关注对应生命周期,生命周期触发时就会执行对应方法。
- 生命周期拥有者使用getLifecycle()获取Lifecycle实例,然后代用addObserve()添加观察者
第一步代码如下:
//让各个组件存储自己的逻辑可使 Activity 和 Fragment 逻辑更易于管理。
class MyObserver : LifecycleObserver {
private val TAG = "Lifecycle_Test"
@OnLifecycleEvent(value = Lifecycle.Event.ON_RESUME)
fun connect() {
Log.i(TAG, "connect: ")
}
@OnLifecycleEvent(value = Lifecycle.Event.ON_PAUSE)
fun disConnect() {
Log.i(TAG, "disConnect: ")
}
}
第二步代码如下:
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
//注册生命周期观察者
lifecycle.addObserver(MyObserver())
}
}
4 LifecycleOwner
实现 LifecycleObserver 的组件可与实现 LifecycleOwner 的组件完美配合,因为所有者可以提供生命周期,而观察者可以注册以观察生命周期。
public interface LifecycleOwner {
/**
* @return The lifecycle of the provider.
*/
@NonNull
Lifecycle getLifecycle();
}
AndroidX在这Activity 、Fragment 中默认实现了 LifecycleOwner 接口,并在中 getLifecycle()方法返回的是LifecycleRegistry注册的对象Lifecycle。
自定义LifecycleOwner
class MyActivity : Activity(), LifecycleOwner {
private lateinit var lifecycleRegistry: LifecycleRegistry
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
lifecycleRegistry = LifecycleRegistry(this)
lifecycleRegistry.markState(Lifecycle.State.CREATED)
}
public override fun onStart() {
super.onStart()
lifecycleRegistry.markState(Lifecycle.State.STARTED)
}
override fun getLifecycle(): Lifecycle {
return lifecycleRegistry
}
}
MyActivity实现LifecycleOwner,getLifecycle()返回lifecycleRegistry实例。lifecycleRegistry实例则是在onCreate创建,并且在各个生命周期内调用markState()方法完成生命周期事件的传递。这就完成了LifecycleOwner的自定义,也即MyActivity变成了LifecycleOwner,然后就可以和 实现了LifecycleObserver的组件配合使用了。
5 Application生命周期 ProcessLifecycleOwner
管理整个应用进程的生命周期可以用ProcessLifecycleOwner,最常见用于判断App处于前后台。
使用ProcessLifecycleOwner需要先添加依赖:
implementation “androidx.lifecycle:lifecycle-process:2.2.0”
class MyApplication : Application() {
override fun onCreate() {
super.onCreate()
//注册App生命周期观察者
ProcessLifecycleOwner.get().lifecycle.addObserver(ApplicationLifecycleObserver())
}
/**
* Application生命周期观察,提供整个应用进程的生命周期
*
* Lifecycle.Event.ON_CREATE只会分发一次,Lifecycle.Event.ON_DESTROY不会被分发。
*
* 第一个Activity进入时,ProcessLifecycleOwner将分派Lifecycle.Event.ON_START, Lifecycle.Event.ON_RESUME。
* 而Lifecycle.Event.ON_PAUSE, Lifecycle.Event.ON_STOP,将在最后一个Activit退出后后延迟分发。如果由于配置更改而销毁并重新创建活动,则此延迟足以保证ProcessLifecycleOwner不会发送任何事件。
*
* 作用:监听应用程序进入前台或后台
*/
private class ApplicationLifecycleObserver : LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_START)
private fun onAppForeground() {
Log.d("Lifecycle_process", "ApplicationObserver: app moved to foreground")
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
private fun onAppBackground() {
Log.d("Lifecycle_process", "ApplicationObserver: app moved to background")
}
}
}