使用 Lifecycle 管理 Activity 和 Fragment 组件的生命周期能够减小重复的样板代码以及减小没必要要的麻烦。bash
假设咱们要实现一个定位的功能,咱们须要在Activity的生命周期回调方法中添加定位sdk的启动和中止方法:markdown
public class LocationActivity extends AppCompatActivity{ private LocationListener listener; @Override protected void onCreate(Bundle savedInstanceState) { // 绑定UI控件 listener = new LocationListener(this); listener.onLocationUpdate(new LocationCallback(){ @Override public void onUpdate(Position position){ // 根据位置数据更新UI } }); } @Override protected void onstart(){ listener.start(); } @Override protected void onStop(){ listener.stop(); } } 复制代码
这是一个很常见的处理方式,可是存在一些缺点:ide
每次使用定位sdk都须要在生命周期中写启动和中止的方法,若是有多个activity使用了sdk就存在不少冗余代码。this
生命周期方法中放置大量代码,这使得它们难以维护。spa
使用 Lifecycle 的方法很是简单,先看 LocationListener
的代码:code
public class LocationListener implements LifecycleObserver { @OnLifecycleEvent(Lifecycle.Event.ON_START) public void start(){ // 启动定位服务 } @OnLifecycleEvent(Lifecycle.Event.ON_STOP) public void stop(){ // 中止定位服务 } } 复制代码
经过上面的代码能够看到咱们只是在原来代码的基础上实现了LifecycleObserver
接口,并在start()
和stop()
方法上加上了表明触发它们的生命周期时机的注解,注解里的参数对应着activity的生命周期。orm
接下来就是在activity中使用就更简单了。server
public class LocationActivity extends AppCompatActivity{ private LocationListener listener; @Override protected void onCreate(Bundle savedInstanceState) { // 绑定UI控件 listener = new LocationListener(this); listener.onLocationUpdate(new LocationCallback(){ @Override public void onUpdate(Position position){ // 根据位置数据更新UI } }); getLifecycle().addObserver(listener); } } 复制代码
到此就实现了最开始定位的功能。接口
在支持库 Support Library 26.1.0 中 activity 和 fragment 提供了默认的getLifecycle()
方法,可是若是咱们想在低版本和非 activity 、fragment类中也实现生命周期该怎么办呢?方法以下:生命周期
public class MyActivity extends Activity implements LifecycleOwner { private LifecycleRegistry mLifecycleRegistry; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mLifecycleRegistry = new LifecycleRegistry(this); mLifecycleRegistry.markState(Lifecycle.State.CREATED); } @Override public void onStart() { super.onStart(); mLifecycleRegistry.markState(Lifecycle.State.STARTED); } @NonNull @Override public Lifecycle getLifecycle() { return mLifecycleRegistry; } } 复制代码
整个 Lifecycle 中有几个重要的类:
Lifecycle
抽象类,定义了一些操做LifecycleObserver
的抽象方法,以及表明生命周期的State
、Event
枚举类。
LifecycleObserver
接口,内部没有定义任何方法,经过Lifecycle.addObserver()
能够注册监听生命周期变化,以注释的方法声明监听。
LifecycleOwner
接口,该接口是由生命周期宿主(activity / fragment)实现的,只有一个Lifecycle getLifecycle()
方法。
LifecycleRegistry
类,它是 Lifecycle
的子类,其内部定义了具体的实现细节,默认状况下,一个宿主实现了 LifecycleOwner
接口后就应该在其内部声明一个LifecycleRegistry
,并在本身的生命周期回调方法中为其设置各类状态:
this.mLifecycleRegistry.markState(State.CREATED);
复制代码