LifeCycle简介
LifeCycle综述
LifeCycle是Google Jetpack组件中的一员,使用LifeCycle完美实现生命周期的管理,如Fragment,Activity等
LifeCycle相关的类
- Lifecycle.java类 : 抽象类,一个持有Android生命周期状态的类。
- LifecycleOwner.java接口:接口,实现该接口的类拥有了生命周期的状态,getLifecycle()可以获得Lifecycle类,使用该Lifecycle类可以实现生命周期的管理。
- LifecycleObserver.java:接口,实现该接口,可以感知LifeCycle的生命周期,通过Lifecycle#addObserver方法实现添加观察者实现感知生命周期。
LifeCycle的使用
简单使用
因为Fragment、AppCompantActivity都已经实现了LifecycleOwner接口,所以使用起来比较简单,如下
- 定义观察者MyObserver,代码如下,实现LifecycleObserver接口,或者LifecycleEventObserver:
class MyObserver:LifecycleObserver{
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
fun resumeEvent() {
Log.d(Common.TAG,"createEvent")
}
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
fun pauseEvent() {
Log.d(Common.TAG,"pauseEvent")
}
}
或者:
class MyObserver2: LifecycleEventObserver {
override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) {
Log.d(Common.TAG,"eventName->${event.name}")
}
}
- 在Activity中注册观察者,代码如下:
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
lifecycle.addObserver(MyObserver())
lifecycle.addObserver(MyObserver2())
}
}
运行日志如下:
进入Activity 1 为MyObserver的日志,2为MyObserver2的日志
退出Activity 1 为MyObserver的日志,2为MyObserver2的日志:
使用Activity,自主实现LifecycleOwner接口
- 继承Activity,实现接口LifeCycleOwner
- 手动派发事件
- 添加监听器
代码如下:
class TestActivity :Activity(),LifecycleOwner{
private var lifecycleRegistry:LifecycleRegistry = LifecycleRegistry(this)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_CREATE)
lifecycleRegistry.addObserver(MyObserver())
lifecycleRegistry.addObserver(MyObserver2())
}
override fun onStart() {
super.onStart()
lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START)
}
override fun onResume() {
super.onResume()
lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_RESUME)
}
override fun onPause() {
super.onPause()
lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_PAUSE)
}
override fun onDestroy() {
super.onDestroy()
lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_DESTROY)
}
override fun getLifecycle(): Lifecycle {
return lifecycleRegistry
}
}
运行日志如下:
其实这块的手动派发是仿照系统的源码中的FragmentActivity写的 部分源码如下:
@Override
protected void onStart() {
super.onStart();
...
//派发在此处
mFragmentLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START);
mFragments.dispatchStart();
}
附言
简单使用中的MyObserver也可继承DefaultLifecycleObserver类(java8中推荐使用这个),重写相关的生命周期对应的方法实现操作
注意:只引入:'implementation 'androidx.appcompat:appcompat:1.1.0’时候**
DefaultLifecycleObserver类找不到,注意引入依赖如下:
implementation 'android.arch.lifecycle:common-java8:2.1.0'
编译报错时候注意加入配置:
android {
...
// java8编译java代码
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
//java8 编译kotlin代码
kotlinOptions{
jvmTarget = '1.8'
}
}
附LifeCycle状态切换图如下:
1、向下为创建的过程,向上为销毁的过程。
2、onStart(CREATED)表示在onStart方法中的状态为CREATED,其余类似。
3、在OnResume和onPause之间为RESUMED状态,比如点击按钮的时候等等。
源码
源码链接:源码
总结
关于Jetpack中的LifeCycle就介绍到此处。
共勉:其实很多的代码都能在源码中找到相关的影子,平时多看看源码对于我们的提示是非常有帮助的。