Android 系统架构组件--生命周期感应组件(Lifecycle-Aware Components)

简介:

       生命周期感应组件简单来说 

        例如:a 启动了b 进行一个耗时操作  当a销毁时 我们应该结束b中的耗时操作 销毁b对象  换句话说 也就是b应该对a的生命周期状态做出正确的相应   生命周期感应组件 就是来使我们这种操作变得更加方便 准确 简洁的一种方式

classMyLocationListener{
    publicMyLocationListener(Context context,Callback callback){
        // ...
    }

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

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

classMyActivityextendsAppCompatActivity{
    privateMyLocationListener myLocationListener;

    @Override
    publicvoid onCreate(...){
        myLocationListener =newMyLocationListener(this,(location)->{
            // update UI
        });
    }

    @Override
    publicvoid onStart(){
        super.onStart();
        myLocationListener.start();
        // manage other components that need to respond
        // to the activity lifecycle
    }

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

}

这段定位代码 看起来 不错 通过监听完成了定位操作对activity周期相应 但是 一般我们会在activity的生命周期(例如onStart)中进行大量其他组件的初始化

那么如果再start执行之前 onstop执行了那么问题就严重了 此时 组件存活时间 超过了正常需要的时间 一般情况下 我们会选择如下的修改方式

class MyActivity extends AppCompatActivity{
    private MyLocationListener myLocationListener;

    publicvoid onCreate(...){
        myLocationListener =newMyLocationListener(this, location ->{
            // update UI
        });
    }

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

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

这样看起来 代码会很复杂 此时 liferecycle-aware 能够很好的帮助我们完成这种事情

lifecycle是一个class 它包括了 组件的生命周期(比如 activity 、fragment) 并且 允许其他组件来观察生命周期活动 (简单来说就像给组件设置观察者)


如图所示 图上的节点 就是组件状态 将事件视为节点之间的边 我们通过在被观察类上面添加注解的形式 来监视其状态 其他类可以通过addObserver()方法

实现状态监听

如下

再project 的build.gradle 添加 google()引用

repositories {
    google()
    jcenter()

在app 的 build.gradle 下添加 插件

// ViewModel and LiveData
implementation "android.arch.lifecycle:extensions:1.1.1"
// alternatively, just ViewModel
implementation "android.arch.lifecycle:viewmodel:1.1.1"
// alternatively, just LiveData
implementation "android.arch.lifecycle:livedata:1.1.1"

创建 状态观察者(lifecycleObserver) myObserver

public class MyObserver implements LifecycleObserver {

    private static final String TAG = "lifeCycle";

    /**
     * 当组件可见时执行
     */
    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    public void onConnectionListener() {
           Log.d(TAG,"onConnectionListener");
    }

    /**
     * 当组件不可见的时候 执行
     */
    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    public void onDisConnectionListener() {
        Log.d(TAG,"onDisConnectionListener");
    }
}
}

创建被观察者(状态持有者 lifecycleowner)

ps:v4包的Fragment与FragmentActivity类实现了LifecycleOwner接口,通过接口里面的getLifecycle()方法获取Lifecycle对象。            我们可以在自己类里面实现LifecycleOwner接口。

那么我们先使用activity 默认 实现

public class MainActivity extends AppCompatActivity {
  
private static final String TAG = "lifeCycle";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        MyObserver myObserver = new MyObserver();
//        注册内容观察者
        getLifecycle().addObserver(myObserver);
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.d(TAG,"onStart");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.d(TAG,"onResume");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.d(TAG,"onPause");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.d(TAG,"onStop");
    }
}

运行结果 : 自己测试被呗  

03-28 20:33:11.899 28311-28311/com.example.lifeapplication D/lifeCycle: onStart
03-28 20:33:11.903 28311-28311/com.example.lifeapplication D/lifeCycle: onResume
03-28 20:33:11.903 28311-28311/com.example.lifeapplication D/lifeCycle: onConnectionListener
03-28 20:33:12.066 28311-28311/com.example.lifeapplication D/lifeCycle: onDisConnectionListener
03-28 20:33:12.066 28311-28311/com.example.lifeapplication D/lifeCycle: onPause
03-28 20:33:12.107 28311-28311/com.example.lifeapplication D/lifeCycle: onResume
03-28 20:33:12.107 28311-28311/com.example.lifeapplication D/lifeCycle: onConnectionListener

下面我们自己实现lifeCycleOwner

public class MainActivity extends AppCompatActivity implements LifecycleOwner {
    private static final String TAG = "lifeCycle";
    /**
     * 创建life 注册表
     */
    private LifecycleRegistry mLifecycleRegistry;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
//        注册MyActivitylifeCycle提供者  由此是不是可以扩展自己的工具类了 哈哈  这里我就不写了
        mLifecycleRegistry = new LifecycleRegistry(this);
        mLifecycleRegistry.markState(Lifecycle.State.CREATED);

        mLifecycleRegistry.addObserver(new MyObserver());
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.d(TAG, "onStart");
        mLifecycleRegistry.markState(Lifecycle.State.STARTED);
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.d(TAG, "onResume");
        mLifecycleRegistry.markState(Lifecycle.State.RESUMED);

    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.d(TAG, "onPause");
        mLifecycleRegistry.markState(Lifecycle.State.DESTROYED);

    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.d(TAG, "onStop");
        mLifecycleRegistry.markState(Lifecycle.State.DESTROYED);
    }

    @Override
    public Lifecycle getLifecycle() {
        return mLifecycleRegistry;
    }
 
 

遗留问题 :  markState 的时候 我没有在State中找到ONPAUSE值   暂时先这么处理吧  有建议的小伙伴 可以帮帮我呢 ~

基本上生命周期管理到这里就结束了 

还有下一章 呢 ~

猜你喜欢

转载自blog.csdn.net/youth_never_go_away/article/details/79655278