本文首发于微信公众号「Android开发之旅」,欢迎关注 ,获取更多技术干货
上一篇文章咱们主要是介绍了Jetpack的由来以及四大组件各包含的组件库。本篇文章咱们未来学习架构组件中的Lifecycle组件。Lifecycle组件是帮忙咱们管理Activity和Fragment的生命周期,也就是说,当Activity或者Fragment的生命周期发送变化的时候咱们能够获得通知。咱们一般会在生命周期方法中调用各类方法或者初始化一些组件亦或是在某个生命周期中调用一些回调,这就致使生命周期相关方法代码比较臃肿,且耦合性高,不易维护。java
我来来看下官方文档给出的回调例子:react
class MyLocationListener { public MyLocationListener(Context context, Callback callback) { // ... } void start() { // connect to system location service } void stop() { // disconnect from system location service } } class MyActivity extends AppCompatActivity { private MyLocationListener myLocationListener; @Override public void onCreate(...) { myLocationListener = new MyLocationListener(this, (location) -> { // update UI }); } @Override public void onStart() { super.onStart(); myLocationListener.start(); // manage other components that need to respond // to the activity lifecycle } @Override public void onStop() { super.onStop(); myLocationListener.stop(); // manage other components that need to respond // to the activity lifecycle } }
这些代码看起来还不错甚至是咱们日常也是这么作的,可是我在响应生命周期的当前状态而进行过多的调用了管理UI和其余组件,这样会在生命周期的方法中书写大量代码,例如onStart()和onStop(),这样就会使代码难以维护。android
基于以上种种缘由,Lifecycle正式登场了。segmentfault
Lifecycle管理生命周期也是观察者模式,其中主要涉及到如下几个类:LifecycleObserver、LifecycleOwner、Lifecycle、State、Event。微信
Event枚举:架构
public enum Event { ON_CREATE, ON_START, ON_RESUME, ON_PAUSE, ON_STOP, ON_DESTROY, ON_ANY }
State枚举:ide
public enum State { DESTROYED, INITIALIZED, CREATED, STARTED, RESUMED; public boolean isAtLeast(@NonNull State state) { return compareTo(state) >= 0; } }
State和Event的对应关系:函数
如何项目已经迁移到AndroidX了,那么就不须要额外导包,由于AndroidX已经包含了Jetpack相关组件了。若是没有迁移,则在build.gradle中配置以下:学习
dependencies { def lifecycle_version = "1.1.1" // ViewModel and LiveData implementation "android.arch.lifecycle:extensions:$lifecycle_version" // alternatively - just ViewModel // For Kotlin use viewmodel-ktx implementation "android.arch.lifecycle:viewmodel:$lifecycle_version" // alternatively - just LiveData implementation "android.arch.lifecycle:livedata:$lifecycle_version" // alternatively - Lifecycles only (no ViewModel or LiveData). // Support library depends on this lightweight import implementation "android.arch.lifecycle:runtime:$lifecycle_version" // For Kotlin use kapt instead of annotationProcessor annotationProcessor "android.arch.lifecycle:compiler:$lifecycle_version" // alternately - if using Java8, use the following instead of compiler implementation "android.arch.lifecycle:common-java8:$lifecycle_version" // optional - ReactiveStreams support for LiveData implementation "android.arch.lifecycle:reactivestreams:$lifecycle_version" // optional - Test helpers for LiveData testImplementation "android.arch.core:core-testing:$lifecycle_version"
配置完成后咱们先定义一个类实现LifecycleObserver:gradle
class MyObserver : LifecycleObserver { @OnLifecycleEvent(Lifecycle.Event.ON_RESUME) fun connectListener() { Log.e("MyObserver","==ON_RESUME==") } @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE) fun disconnectListener() { Log.e("MyObserver","==ON_PAUSE==") } }
接受事件是经过注解OnLifecycleEvent来完成的,参数即为上文中的Event枚举。
接下来咱们在Activity中添加这个观察者:
class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) lifecycle.addObserver(MyObserver()) } }
这就是最简单的使用,这个时候咱们其实已经能够监听到Activity的生命周期变化了。
com.jetpack.jetpackdemo E/MyObserver: ==ON_RESUME== com.jetpack.jetpackdemo E/MyObserver: ==ON_PAUSE==
这样使用,会不会有个疑问呢?咱们在Observer中注册了Event事件,可是在Activity的生命周期方法中并无指定State状态。这是如何作到关联的呢?在Android Support Library 26.1.0 及其以后的版本,Activity和Fragment已经默认实现了LifecycleOwner接口,因此不须要咱们在从新设置。
当咱们有些类没有实现AppCompatActivity的时候咱们也想使用Lifecycle,那么就须要自定义了,也就是须要咱们本身实现
LifecycleOwner接口。MyObserver类不变,MainActivity类改变以下:
class MainActivity : Activity(), LifecycleOwner { private lateinit var lifecycleRegistry: LifecycleRegistry override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) lifecycleRegistry = LifecycleRegistry(this) lifecycle.addObserver(MyObserver()) } override fun onResume() { super.onResume() lifecycleRegistry.currentState = Lifecycle.State.RESUMED } override fun onPause() { super.onPause() lifecycleRegistry.currentState = Lifecycle.State.DESTROYED } override fun getLifecycle(): Lifecycle { return lifecycleRegistry } }
这样就是全部的设置必须由咱们本身来完成。打印结果仍是同样的,以下:
com.jetpack.jetpackdemo E/MyObserver: ==ON_RESUME== com.jetpack.jetpackdemo E/MyObserver: ==ON_PAUSE==
本文主要是介绍了Lifecycle相关的API以及简单的使用。在实际项目中仍是要结合ViewModel和LiveData来使用。经过ViewModel来获取所需数据,并经过观察LiveData对象将数据变化反映到视图中。后续文章咱们将继续介绍ViewModel和LiveData的使用。
Jetpack架构组件 — LiveData与ViewModel入坑详解
Android Jetpack架构组件 — Room入坑详解