Android之MVVM架构指南(三):Lifecycle

935 阅读2分钟

使用 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();
	}

}


这是一个很常见的处理方式,但是存在一些缺点:

  1. 每次使用定位sdk都需要在生命周期中写启动和停止的方法,如果有多个activity使用了sdk就存在很多冗余代码。

  2. 生命周期方法中放置大量代码,这使得它们难以维护。

使用 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 的抽象方法,以及代表生命周期的StateEvent枚举类。

  • LifecycleObserver接口,内部没有定义任何方法,通过Lifecycle.addObserver()可以注册监听生命周期变化,以注释的方法声明监听。

  • LifecycleOwner 接口,该接口是由生命周期宿主(activity / fragment)实现的,只有一个Lifecycle getLifecycle() 方法。

  • LifecycleRegistry 类,它是 Lifecycle的子类,其内部定义了具体的实现细节,默认情况下,一个宿主实现了 LifecycleOwner 接口后就应该在其内部声明一个LifecycleRegistry ,并在自己的生命周期回调方法中为其设置各种状态:

this.mLifecycleRegistry.markState(State.CREATED);