Android开发Android技术知识

通过Lifecycle-Aware 组件处理生命周期[翻译]

2018-10-13  本文已影响52人  horseLai

引入概念

class MyLocationListener {
    public MyLocationListener(Context context, Callback callback) {
        // ...
    }

    void start() {
        // connect to system location service
    }

    void stop() {
        // disconnect from system location service
    }
} 

class MyActivity extends AppCompatActivity {
    private MyLocationListener myLocationListener;

    @Override
    public void onCreate(...) {
        myLocationListener = new MyLocationListener(this, (location) -> {
            // update UI
        });
    } 
    @Override
    public void onStart() {
        super.onStart();
        myLocationListener.start();
        // manage other components that need to respond
        // to the activity lifecycle
    }

    @Override
    public void onStop() {
        super.onStop();
        myLocationListener.stop();
        // manage other components that need to respond
        // to the activity lifecycle
    }
}

class MyActivity extends AppCompatActivity {
    private MyLocationListener myLocationListener;

    public void onCreate(...) {
        myLocationListener = new MyLocationListener(this, location -> {
            // update UI
        });
    }

    @Override
    public void onStart() {
        super.onStart();
        Util.checkUserStatus(result -> {
            // what if this callback is invoked AFTER activity is stopped?
            if (result) {
                myLocationListener.start();
            }
        });
    }

    @Override
    public void onStop() {
        super.onStop();
        myLocationListener.stop();
    }
}

Lifecycle的概念


LifeOwner的概念

lifecycle-aware 组件最佳实践


lifecycle-aware 组件使用场景

lifecycle-aware组件可以在各种场景中让生命周期的管理更简单,比如以下场景:


处理 onStop 事件

Lifecycle关联到AppCompatActivityFragment时,它的状态会切换到CREATED,而ON_STOP状态则是会在AppCompatActivityFragmentonSaveInstanceState()被调用是触发。

如果AppCompatActivityFragment是通过onSaveInstanceState()中保存状态的,那么在ON_START被调用之前,它们的UI状态都会被认定为不可变的(immutable)。这时如果尝试在UI状态保存后修改UI的话,就会导致应用导航状态不一致,这也就是为什么在状态保存后执行FragmentTransactionFragmentManager会抛异常的原因了,具体看 commit()方法

如果LiveData的已经关联到LifecycleObserver还没到到达STARTED状态的话, LiveData可以通过终止observer的调用来避免上述边角情况的发生,这是因为LiveData会在执行Observer之前先调用isAtLeast()确定状态,然后再决定是否执行。

然而不幸的是,AppCompatActivityonStop()方法实在onSaveInstanceState()之后调用的,这种情况就导致已经保存的UI状态不允许改变,而Lifecycle又还没有到达STARTED状态。

为了避免这个问题的发生,在版本beta2及之前的Lifecycle类都会将这一状态标记为CREATED,而不分发这一事件,这样,任何检查当前状态的代码都能拿到真实状态值,即使这一事件还没有被分发,直到系统调用onStop()方法。

然而又不幸的是,这个解决方案有两大问题:

Note: 为了简化流程并兼容老版本,请直接从版本1.0.0-rc1开始使用Lifecycle对象会被标记为CREATED,并且会在onSaveInstanceState()被调用是标记为ON_STOP状态,而无需等待onStop()的调用。虽然这并不会影响我们的代码,但是确是我们需要注意的,因为它没有遵循API 26及以前版本中Activity的生命周期调用次序

上一篇下一篇

猜你喜欢

热点阅读