- Jetpack系列文章
- Android Jetpack架构组件-Lifecycle使用
- Android Jetpack架构组件-LiveData使用
- Android Jetpack架构组件-ViewModel的使用及原理
- Android Jetpack架构组件-Paging介绍及实践
- Android Jetpack架构组件-Room基本使用
- Android Jetpack架构组件-Room数据库查询艺术
- Android Jetpack架构组件-Room升级
- Android Jetpack架构组件-WorkManager使用篇
- Android Jetpack架构-Paging自定义上拉加载更多
Lifecycle
是一个类,用于存储有关组件(如 Activity 或 Fragment)的生命周期状态的信息,并允许其他对象观察此状态。
Lifecycle
?在实际应用开发中,多数应用组件都存在生命周期,但是生命周期由操作系统和进程中运行的框架代码管理,它们是Android运行方式的核心,应用必须遵循它们,如果不这样做,可能会引发内存泄漏甚至应用崩溃
假如我们有一个屏幕上显示设备位置的Activity,常规实现如下所示:
class MyLocationListener(
private val context: Context,
private val callback: (Location) -> Unit
) {
fun start() {
// connect to system location service
Log.d("lifecycle","MyLocationListener start")
}
fun stop() {
// disconnect from system location service
Log.d("lifecycle","MyLocationListener stop")
}
}
在Activity中通过接口回调来实现UI更新
class LifecycleActivity : AppCompatActivity() {
private lateinit var myLocationListener: MyLocationListener
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_lifecycle)
myLocationListener = MyLocationListener(this) {
//更新UI
}
}
override fun onStart() {
super.onStart()
myLocationListener.start()
}
override fun onStop() {
super.onStop()
myLocationListener.stop()
}
}
虽然此示例看起来没问题,但在实际的应用中,定位功能会有太多界面和其他组件的调用,这样写会有啥问题?
在生命周期方法(如 onStart()
和 onStop()
)中放置大量的代码,显得不太优雅且难以维护
在组件中做了耗时操作(比如在onStart
方法),这种写法就无法保证组件在Activity
或者Fragment
停止之前完成启动。
因此我们需要一个能管理Activity和Fragment的生命周期的库,这个库就是Lifecycle
。
新建一个LastLocationListener
类,它实现了LifecycleObserver
接口,说明LastLocationListener
成为了一个Lifecycle的观察者。
class LastLocationListener :LifecycleObserver{
@OnLifecycleEvent(Lifecycle.Event.ON_START)
fun start() {
// connect to system location service
Log.d("lifecycle","LastLocationListener start")
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
fun stop() {
// disconnect from system location service
Log.d("lifecycle","LastLocationListener stop")
}
}
在Activity中实现观察者注册
class LifecycleActivity : AppCompatActivity() {
private lateinit var lastLocationListener: LastLocationListener
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_lifecycle)
// 注释1
lastLocationListener = LastLocationListener()
lifecycle.addObserver(lastLocationListener)
}
}
然后在注释1处将LastLocationListener添加到LifecycleOwner中。LifecycleOwner是一个接口,其内部只有一个方法getLifecycle(),getLifecycle方法用于获取Lifecycle,这样就可以将LastLocationListener添加到Lifecycle中,当Lifecycle的生命周期发生变化时,LastLocationListener就会观察到,或者说是感知到。
简单说明一下就是:
先实现LastLocationListener,对ON_START
和ON_STOP
事件进行监听。因为在Android Support Library 26.1.0
及其之后的版本,Activity和Fragment已经默认实现了LifecycleOwner
接口,所以在注释1处可以直接使用getLifecycle
方法获取Lifecycle
对象,这样LastLocationListener
就可以观察LifecycleActivity
的生命周期变化了,LifecycleOwner
可以理解为被观察者,默认实现了LifecycleOwner
接口,也就是说LifecycleActivity
是被观察者。
只要在LifecycleActivity的onCreate方法中添加LastLocationListener,那么LastLocationListener就可以观察到LifecycleActivity
的各个生命周期的变化。
如果想实现自定义LifecycleOwner,可以使用LifecycleRegistry,它是Lifecycle的实现类。Android Support Library 26.1.0及其之后的版本,Activity和Fragment已经默认实现了LifecycleOwner接口,因此我们可以这么写:
package com.onexzgj.inspur.pageingsample.lifecycle
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.LifecycleRegistry
import com.onexzgj.inspur.pageingsample.R
/**
* 自定义LifecycleOwner
*/
class MyLifecycleOwnerActivity : AppCompatActivity(), LifecycleOwner {
private lateinit var lifecycleRegistry: LifecycleRegistry
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_my_lifecycle_owner)
lifecycleRegistry = LifecycleRegistry(this)
lifecycleRegistry.currentState = Lifecycle.State.CREATED
}
override fun getLifecycle(): Lifecycle {
return super.getLifecycle()
}
override fun onStart() {
super.onStart()
lifecycleRegistry.currentState = Lifecycle.State.STARTED
}
override fun onDestroy() {
super.onDestroy()
lifecycleRegistry.currentState = Lifecycle.State.DESTROYED
}
}
通过新建LifecycleRegistry,为LifecycleRegistry设置Lifecycle的各种状态,并通过getLifecycle方法返回该LifecycleRegistry。
总结
这一篇介绍了Lifecycle的基本用法,并通过简单案例来帮助大家消化理解,具体在项目中的使用也不难,唯一还算难点的是Lifecycle的原理,待后续更新更新Lifecycle的原理。
文章中的示例代码见Jetpack_Component
##详细介绍文章
Android Jetpack架构组件-Lifecycle使用
Android Jetpack架构组件-LiveData使用
Android Jetpack架构组件-ViewModel的使用及原理
Android Jetpack架构组件-Paging介绍及实践
Android Jetpack架构组件-Room基本使用
Android Jetpack架构组件-Room数据库查询艺术
Android Jetpack架构组件-Room升级
Android Jetpack架构组件-WorkManager使用篇
项目目录结构为如下