Jetpack之Lifecycle(一)Lifecycle简介及使用方法

1、为什么需要Lifecycle

在 Android 框架中定义的大多数应用组件都存在生命周期。生命周期由操作系统或进程中运行的框架代码管理。它们是 Android 运作方式的核心,应用必须遵循它们。如果不这样做,可能会引发内存泄露甚至应用崩溃。那么我们在开发中如果想自己监听activity的声明周期,可能会需要这样写:

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
        }
    }

虽然此示例看起来没问题,但在真实的应用中,最终会有太多管理界面和其他组件的调用,以响应生命周期的当前状态。管理多个组件会在生命周期方法(如 onStart() 和 onStop())中放置大量的代码,这使得它们难以维护。

此外,无法保证组件会在 Activity 或 Fragment 停止之前启动。在我们需要执行长时间运行的操作(如 onStart() 中的某种配置检查)时尤其如此。这可能会导致出现一种竞争条件,在这种条件下,onStop() 方法会在 onStart() 之前结束,这使得组件留存的时间比所需的时间要长。

2、什么是Lifecycle

Lifecycle 是一个类,用于存储有关组件(如 Activity 或 Fragment)的生命周期状态的信息,并允许其他对象观察此状态。

Lifecycle 使用两种主要枚举跟踪其关联组件的生命周期状态:
Event
从框架和 Lifecycle 类分派的生命周期事件。这些事件映射到 Activity 和 Fragment 中的回调事件。
State
由 Lifecycle 对象跟踪的组件的当前状态。
Jetpack之Lifecycle(一)Lifecycle简介及使用方法_第1张图片

3、Lifecycle使用方法

3.1在相应的moudle目录下的build.gradle中添加以下依赖:

dependencies {
    //...
    def lifecycle_version = "1.1.1"
    implementation "android.arch.lifecycle:runtime:$lifecycle_version"
}

3.2 实现LifecycleObserver接口

public class MyLifecycle implements LifecycleObserver {
    private static final String TAG = "MyLifecycle";

    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
    public void onCreate() {
        Log.d(TAG, "onCreate: ");
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    public void onStart() {
        Log.d(TAG, "onStart: ");
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    public void onResume() {
        Log.d(TAG, "onResume: ");
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    public void onPause() {
        Log.d(TAG, "onPause: ");
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    public void onStop() {
        Log.d(TAG, "onStop: ");
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    public void onDestroy() {
        Log.d(TAG, "onDestroy: ");
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_ANY)
    public void onAny() {
        Log.d(TAG, "onAny: ");
    }
}

通过实现LifecycleObserver接口,然后在相应的方法上面添加注解@OnLifecycleEvent(Lifecycle.Event.XXX)即可。实际上,这就是一个观察者。当执行到某个生命周期时,会通知观察者执行对应的方法。

3.3 Activity中添加观察者

public class TestActivity extends AppCompatActivity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.test_activity);
        getLifecycle().addObserver(new MyLifecycle());
    }
}

继承AppCompatActivity后,即可通过添加观察者来监听此Activity的生命周期了。相比第2小节的例子,只要一句话就完事,是不是简单多了呢。到这里,Lifecycle的简单使用例子就完成了。

我们来看下一个完整的生命周期的输出结果:

2020-04-16 16:28:02.976 12162-12162/com.gc.loading D/MyLifecycle: onCreate: 
2020-04-16 16:28:02.976 12162-12162/com.gc.loading D/MyLifecycle: onAny: 
2020-04-16 16:28:02.978 12162-12162/com.gc.loading D/MyLifecycle: onStart: 
2020-04-16 16:28:02.978 12162-12162/com.gc.loading D/MyLifecycle: onAny: 
2020-04-16 16:28:02.981 12162-12162/com.gc.loading D/MyLifecycle: onResume: 
2020-04-16 16:28:02.982 12162-12162/com.gc.loading D/MyLifecycle: onAny: 
2020-04-16 16:28:06.152 12162-12162/com.gc.loading D/MyLifecycle: onPause: 
2020-04-16 16:28:06.152 12162-12162/com.gc.loading D/MyLifecycle: onAny: 
2020-04-16 16:28:06.513 12162-12162/com.gc.loading D/MyLifecycle: onStop: 
2020-04-16 16:28:06.513 12162-12162/com.gc.loading D/MyLifecycle: onAny: 
2020-04-16 16:28:06.514 12162-12162/com.gc.loading D/MyLifecycle: onDestroy: 
2020-04-16 16:28:06.514 12162-12162/com.gc.loading D/MyLifecycle: onAny: 

你可能感兴趣的:(架构)