Android developers 提供的支持库越来越完善,不知大家在开发中有没有升级 Jetpack,也就是引入 androidX 包,Jetpack 确实简化了代码,提升了效率。下面介绍架构组件中的 Lifecycle,官网的介绍:使用生命周期感知型组件处理生命周期 非常详细,我就介绍一下 Lifecycle 在开发中的实践。

1. 重构之前

项目中有许多组件和 Activity 的生命周期有关联,比如 SensorManager 在 resume 时注册,pause 时解除注册。Camera 在 resume 时打开,pause 时关闭等。代码写起来就像下面这样:

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
        mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
    }   

    @Override
    protected void onResume() {
        super.onResume();
        mSensorManager.registerListener(this, mSensor, SensorManager.SENSOR_DELAY_NORMAL);
      // manage other components that need to respond
            // to the activity lifecycle
    }

    @Override
    protected void onPause() {
        super.onPause();
        mSensorManager.unregisterListener(this);
      // manage other components that need to respond
            // to the activity lifecycle
    }

如果需要响应 Activity 生命周期的组件非常多,那么代码将变得非常臃肿难以维护。组件对外暴露的状态接口太多,稍不留神就会出错,这种转发式的调用并不是优雅的做法。

2. 重构之后

抽离 Sensor 相关代码形成新类,封装 Sensor 注册、解除注册和监听操作,最重要的是可感知生命周期。本质上是观察者设计模式,Activity 是 LifecycleOwner,具有 Lifecycle,是被观察者;LifeCycleSensorManager 实现 LifecyclerObserver 接口,是观察者。外部不需要传递生命周期状态进来,LifeCycleSensorManager 内部可感知生命周期。这样使用时,只要一行代码即可,非常干净清爽。

public final class LifeCycleSensorManager implements LifecycleObserver, SensorEventListener {
    private Sensor mSensor;
    private SensorManager mSensorManager;
    private Lifecycle mLifecycle;

    public LifeCycleSensorManager(final Context context, final Lifecycle lifecycle) {
        mSensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
        mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        lifecycle.addObserver(this);
        mLifecycle = lifecycle;
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    public void onResume() {
        mSensorManager.registerListener(this, mSensor, SensorManager.SENSOR_DELAY_NORMAL);
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    public void onPause() {
        mSensorManager.unregisterListener(this);
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    public void onDestroy() {
        mLifecycle.removeObserver(this);
    }

    @Override
    public void onSensorChanged(SensorEvent event) {
    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {
    }
}