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 对象跟踪的组件的当前状态。
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: