Jetpack学习笔记之Lifecycle (1)
年初就接触Jetpack了,刚研究了一下官方的Sunflower实例,不过后来忙其它的,就一直停止不前了。 听说康师傅最近在准备Jetpack相关的课程,赶紧跟着学起来,顺便复习一下kotlin。
PS:此文就是先行学习笔记,更准确的请参考官方文档和康师傅的课程。
官方文档地址:https://developer.android.google.cn/topic/libraries/architecture/lifecycle
定义
Lifecycle是Jetpack提供的一个组件,可以感知Activity,Fragment的生命周期变化。这些组件可以根据 Activity 或 Fragment 的当前生命周期状态自动调整其行为。
相关概念
-
LifecycleOwner:我们的 Activity/Fragment 都实现了该接口,用以声明它是一个能够提供生命周期事件的宿主。同时必须复写getLifecycle()方法提供一个Lifecycle对象;
-
Lifecycle:是一个抽象类,里面定义了两个枚举State宿主的状态,Event 需要分发的事件的类型;
-
LifecycleRegistry: 是 Lifecycle 的唯一实现类,主要用来负责注册 Observer,以及分发宿主状态事件给它们。
使用
android {
compileSdkVersion 29
buildToolsVersion "29.0.3"
defaultConfig {
// 省略
}
buildTypes {
// 省略
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
}
dependencies {
def lifecycle_version = "2.2.0"
//省略部分
//添加以下两个依赖
implementation "androidx.lifecycle:lifecycle-runtime-ktx:$lifecycle_version"
implementation "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version"
}
监听 Activity 生命周期
通过Lifecycle监听生命周期主要有两种方式:
1.继承 DefaultLifecycleObserver或FullLifecycleObserver,在其重载方法中处理。
class MyLifecycleObserver1:DefaultLifecycleObserver {
override fun onCreate(owner: LifecycleOwner) {
super.onCreate(owner)
Log.d("itshizhan", "onCreate")
}
override fun onStart(owner: LifecycleOwner) {
super.onStart(owner)
Log.d("itshizhan", "onResume")
}
override fun onResume(owner: LifecycleOwner) {
super.onResume(owner)
Log.d("itshizhan", "onPause")
}
override fun onPause(owner: LifecycleOwner) {
super.onPause(owner)
Log.d("itshizhan", "onStart")
}
override fun onStop(owner: LifecycleOwner) {
super.onStop(owner)
Log.d("itshizhan", "onStop")
}
override fun onDestroy(owner: LifecycleOwner) {
super.onDestroy(owner)
Log.d("itshizhan", "onDestroy")
}
}
在需要监听生命周期的 Activity 中,给 lifecycle 添加此观察者:
class MainActivity: AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// 添加观察者
lifecycle.addObserver(MyLifecycleObserver1())
}
}
这样当宿主的生命周期发生变化时,就会分发给 lifecycle 观察者。
2.自定义LifecycleObserver,配合@OnLifecycleEvent注解
class MyLifecycleObserver2: LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
fun create() {
Log.d("itshizhan", "ON_CREATE")
}
@OnLifecycleEvent(Lifecycle.Event.ON_START)
fun start() {
Log.d("itshizhan", "ON_START")
}
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
fun resume() {
Log.d("itshizhan", "ON_RESUME")
}
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
fun pause() {
Log.d("itshizhan", "ON_PAUSE")
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
fun stop() {
Log.d("itshizhan", "ON_STOP")
}
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
fun destroy() {
Log.d("itshizhan", "ON_DESTROY")
}
}
注册方式同方式1.
Lifecycle 的5中状态
官方提供了一张图,从中可知:
Lifecycle 一共有五种状态,分别是:
- INITIALIZED
- CREATED
- STARTED
- RESUMED
- DESTROYED
当 Lifecycle 处于 STARTED 或 RESUMED 状态时,我们认为 Lifecycle 是 active 的,否则认为是 inactive 的。
官方推荐的最佳实践
Lifecycle 的强大功能是配合 ViewModel 和LiveData 等。
- 使界面控制器(Activity 和 Fragment)尽可能保持精简
- 编写数据驱动型界面,数据更改更新视图,用户操作通知给 ViewModel
- 将数据逻辑放在 ViewModel类中。 ViewModel,充当连接器。
- 不过要注意,ViewModel 不负责获取数据(例如,从网络获取)。
- ViewModel应调用相应的组件来获取数据,然后将结果提供给界面控制器。
- 使用 Data Binding在视图与界面控制器之间维持干净的接口。
- 避免在 ViewModel 中引用 View 或 Activity上下文。
- 使用 Kotlin 协程管理长时间运行的任务和其他可以异步运行的操作。
应用场景
- 监听 Application 生命周期
- 监听 app 前后台切换