Lifecycle官方文档地址:https://developer.android.com/topic/libraries/architecture/lifecycle。
一、为什么要使用Lifecycle?
Activity 和 Fragment 是有声明周期的,开发时我们的很多操作需要写在声明周期的方法中,比如,下载、文件操作等。这样很多情况下会导致,我们在 Activity中 的声明周期方法中写越来越多的代码,从而使得 Activity 或者 Fragment 越来越臃肿,代码维护越来越困难。这时我们使用Lifecycle就可以很好的解决这类问题。
Lifecycle代码简洁,我们可以通过实现LifecycleObserver 接口来监听声明周期,然后我们在Activity和Fragment中去注册监听。
Lifecycle 的原理图如下:
看完原理图后,我们应该对Lifecycle有一些简单的理解和认知了,下面我们来讲述一下Lifecycle如何使用。
二、Lifecycle 的使用说明
2.1 几个重要的类和接口
Lifecycle: Lifecycle是一个持有组件生命周期状态(如Activity或Fragment)的信息的类,并允许其他对象观察此状态。
Event :从框架和Lifecycle类派发的生命周期事件。这些事件映射到活动和片段中的回调事件。
State :由Lifecycle对象跟踪的组件的当前状态。
LifecycleOwner (重要)Lifecycle持有者:实现该接口的类持有生命周期(Lifecycle对象),该接口的生命周期(Lifecycle对象)的改变会被其注册的观察者LifecycleObserver观察到并触发其对应的事件。
LifecycleObserver(重要)Lifecycle观察者:实现该接口的类,通过注解的方式,可以通过被LifecycleOwner类的addObserver(LifecycleObserver o)方法注册,被注册后,LifecycleObserver便可以观察到LifecycleOwner的生命周期事件。
2.2 LifeCycleOwner 和 LifecycleObserver
(1). 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的类中注册了它,当声明周期发生变化时,它就能收到,进行我们自定义的操作。
三、Lifecycle 实战
目前Activity可以不用实现 LifecycleOwner,从API14开始 AppCompatActivity已经在内部实现了 LifecycleOwner,我们只需要使用AppCompatActivity结合Lifecycle一起使用即可。
页面代码:
public class MainActivity extends AppCompatActivity { MyObserver myObserver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); myObserver = new MyObserver(); getLifecycle().addObserver(myObserver); } public void toSecond(View view) { startActivity(new Intent(this, SecondActivity.class)); } @Override protected void onDestroy() { super.onDestroy(); getLifecycle().removeObserver(myObserver); } }
组件监听代码:
package com.renhui.lifecycle; import android.arch.lifecycle.Lifecycle; import android.arch.lifecycle.LifecycleObserver; import android.arch.lifecycle.OnLifecycleEvent; public class MyObserver implements LifecycleObserver { @OnLifecycleEvent(Lifecycle.Event.ON_CREATE) public void ON_CREATE() { System.out.println("MyObserver:ON_CREATE"); } @OnLifecycleEvent(Lifecycle.Event.ON_START) public void ON_START() { System.out.println("MyObserver:ON_START"); } @OnLifecycleEvent(Lifecycle.Event.ON_RESUME) public void ON_RESUME() { System.out.println("MyObserver:ON_RESUME"); } @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE) public void ON_PAUSE() { System.out.println("MyObserver:ON_PAUSE"); } @OnLifecycleEvent(Lifecycle.Event.ON_STOP) public void ON_STOP() { System.out.println("MyObserver:ON_STOP"); } @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY) public void ON_DESTROY() { System.out.println("MyObserver:ON_DESTROY"); } }
Demo地址:https://github.com/renhui/LiftCycle-master
四、进阶用法
我们可以在初始化MyObserver的时候将lifecycle传入,在MyObserver中进行操作时再次确认宿主的”生命周期”状态。
if (lifecycle.getCurrentState().isAtLeast(STARTED)) { //do something }
另外,官网提供了生命周期感知组件的最佳实战的建议:
- 尽可能保持您的UI控制器(活动和片段)尽可能精简。他们不应该试图获取他们自己的数据;相反,使用ViewModel来做到这一点,并观察一个LiveData对象来反映更改回视图。
- 尝试编写数据驱动的用户界面,其中您的用户界面控制器的职责是在数据更改时更新视图,或将用户操作通知给ViewModel。
- 把你的数据逻辑放在ViewModel类中。ViewModel应作为您的UI控制器和其他应用程序之间的连接器。但要小心,ViewModel不负责提取数据(例如,来自网络)。相反,ViewModel应调用相应的组件来获取数据,然后将结果提供给UI控制器。
- 使用dataBinding在视图和UI控制器之间保持干净的界面。这使您可以使您的视图更具说明性,并最大限度地减少需要在活动和片段中编写的更新代码。
如果你喜欢用Java编程语言来做到这一点,可以使用像Butter Knife这样的库来避免样板代码并且有更好的抽象。
- 如果您的UI很复杂,请考虑创建一个演示者类(presenter)来处理UI修改。这可能是一项艰巨的任务,但它可以使您的UI组件更易于测试。
- 避免在ViewModel中引用View或Activity上下文。
如果ViewModel超出活动(在配置更改的情况下),则活动会泄漏并且垃圾收集器无法正确处理。