1、为什么要使用lifecycle?
activity 和fragment 是有声明周期的,有时候,我们的很多操作需要写在声明周期的方法中,比如,下载,文件操作等,这样很多情况下回导致,我们在activity中的声明周期方法中写越来越多的代码,activity或者fragment 越来越臃肿,代码维护越来越困难。 使用lifecycle就可以很好的解决这类问题。
lifecycle代码简洁,我们可以通过实现LifecycleObserver 接口,来监听声明周期,然后我们在activity和fragment中去注册监听。
2、几个重要的类和接口
Lifecycle
Lifecycle是一个持有组件生命周期状态(如Activity或Fragment)的信息的类,并允许其他对象观察此状态。
Event :从框架和Lifecycle类派发的生命周期事件。这些事件映射到活动和片段中的回调事件。
State :由Lifecycle对象跟踪的组件的当前状态。
LifecycleOwner (重要)Lifecycle持有者
实现该接口的类持有生命周期(Lifecycle对象),该接口的生命周期(Lifecycle对象)的改变会被其注册的观察者LifecycleObserver观察到并触发其对应的事件。
LifecycleObserver(重要)Lifecycle观察者
实现该接口的类,通过注解的方式,可以通过被LifecycleOwner类的addObserver(LifecycleObserver o)方法注册,被注册后,LifecycleObserver便可以观察到LifecycleOwner的生命周期事件。
3、LifeCycle中两个重要的接口LifeCycleOwner和LifecycleObserver 的使用
(1)LifecycleOwner(生命周期持有者接口)
官网介绍:LifecycleOwner是一个单一的方法接口,表示该类有一个 Lifecycle。它有一个方法,getLifecycle()这个方法 必须由这个类来实现。如果您试图管理整个应用程序进程的生命周期,请参阅 ProcessLifecycleOwner。该接口从各个类(如Fragment和AppCompatActivity)抽象生命周期的所有权,并允许编写与它们一起工作的组件。
任何自定义应用程序类都可以实现LifecycleOwner接口
实现LifecycleObserver的组件与实现LifecycleOwner的组件无缝协作,因为所有者可以提供生命周期,观察者可以注册以观看
简单来说,LifecycleOwner就是一个接口,谁继承了它,就持有了lifecycle对象。然后就可以调用getLifecycle()方法获取继承了抽象类Lifecycle的LifecycleRegistry,然后调用 addObserver(@NonNull LifecycleObserver observer) 方法来注册监听。
这样,该接口的生命周期(Lifecycle对象)的改变会被其注册的观察者LifecycleObserver观察到并触发其对应的事件。
注意:Support Library 26.1.0 及其以后的版本,Activity 和Fragment 已经实现了LifecycleOwner 接口,所以,我们可以直接在Activity 和Fragment中使用getLifecycle()方法来获取lifecycle对象,来添加观察者监听。
(2)LifecycleObserver(生命周期观察者接口)
LifecycleObserver 是一个观察者接口,实现了它,可以通过注解或者继承的方式,来管理声明周期的监听。只要在持有lifecycle的类中注册了它,当声明周期发生变化时,它就能收到,进行我们自定义的操作。
两种实现方式:
实现DefultLifecyceObserver接口,然后重写里面生命周期方法;
直接实现LifecycleObserver接口,然后通过注解的方式来接收生命周期的变化;
Lifecycle.java文档中是建议使用第一种方式,因为文档中说明了,随着Java8成为主流,注解的方式会被弃用。DefaultLifecycleObserver是需要另外声明的java8 比如下面
GenericLifecycleObserver,FullLifecycleObserver,DefaultLifecycleObserver 这三个接口都是直接或者间接继承的LifecycleObserver
// 如果使用的是java 8要显示声明如下的deflifecycle_version="1.1.1"implementation"android.arch.lifecycle:common-java8:$lifecycle_version"
接下来,我们要做的是要写一个需要拥有声明周期的类,正常我们自定义控件啊,或者做其他逻辑的类,是没有声明周期的,现在有了LifecycleObserver,我们可以让一个普通的类拥有感知声明周期变化的能力。比如,现在自定义一个,MyObserver类。
publicclassMyObserverimplementsDefaultLifecycleObserver{privatestaticfinalString TAG ="MyListener";@OverridepublicvoidonCreate(@NonNull LifecycleOwner owner){ Log.d(TAG,"onCreate()"); Log.d(TAG,"当前生命周期状态="+lifecycle.getCurrentState().name()); }@OverridepublicvoidonStart(@NonNull LifecycleOwner owner){ Log.d(TAG,"onStart()"); Log.d(TAG,"当前生命周期状态="+lifecycle.getCurrentState().name()); }@OverridepublicvoidonResume(@NonNull LifecycleOwner owner){ Log.d(TAG,"onResume()"); Log.d(TAG,"当前生命周期状态="+lifecycle.getCurrentState().name()); }@OverridepublicvoidonPause(@NonNull LifecycleOwner owner){ Log.d(TAG,"onPause()"); Log.d(TAG,"当前生命周期状态="+lifecycle.getCurrentState().name()); }@OverridepublicvoidonStop(@NonNull LifecycleOwner owner){ Log.d(TAG,"onStop()"); Log.d(TAG,"当前生命周期状态="+lifecycle.getCurrentState().name()); }@OverridepublicvoidonDestroy(@NonNull LifecycleOwner owner){ Log.d(TAG,"onDestroy() "); Log.d(TAG,"当前生命周期状态="+lifecycle.getCurrentState().name()); }}
更多嘟嘟嘟嘟。。。。。