使用 Lifecycle 管理 Activity 和 Fragment 组件的生命周期可以减少重复的样板代码以及减少不必要的麻烦。
开发中生命周期存在的问题
假设我们要实现一个定位的功能,我们需要在Activity的生命周期回调方法中添加定位sdk的启动和停止方法:
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();
}
}
这是一个很常见的处理方式,但是存在一些缺点:
每次使用定位sdk都需要在生命周期中写启动和停止的方法,如果有多个activity使用了sdk就存在很多冗余代码。
生命周期方法中放置大量代码,这使得它们难以维护。
使用 Lifecycle
使用 Lifecycle 的方法非常简单,先看 LocationListener
的代码:
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的生命周期。
接下来就是在activity中使用就更简单了。
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);
}
}
到此就实现了最开始定位的功能。
自定义 Lifecycle 组件
在支持库 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);