本篇是Jetpack组件系列文章的第三篇,将介绍第二个组件Lifecycle。Lifecycle为开发者管理 Activity 和 Fragment 生命周期提供了极大的便利,帮助开发者书写更轻量、易于维护的代码。
目录
一、友情提示
Jetpack组件构成图
Jetpack组件系列下一篇
二、Lifecycle简介
Lifecycle用于存储有关组件(如 activity 或 fragment)的生命周期状态的信息,并允许其他对象观察此状态。Lifecycle使用事件和状态两种枚举跟踪其关联组件的生命周期状态,以下是官方的图片:
对以上图片的流程稍加文字说明
1、状态
状态即activity或fragment的生命周期状态,从初始态INITIALIZED开始,启动activity或fragment分别经过onCreat > onStart > onResume,而与此对应的销毁生命周期为onPause > onStop > onDestroy
2、事件
Lifecycle持有界面的生命周期状态信息,允许其他观察者去观察其持有的状态。那如何通知其他观察者?毫无疑问是通过事件Event来的,分别有ON_CREATE、ON_START、ON_RESUME、ON_PAUSE、ON_STOP和ON_DESTROY。当界面的生命周期发生变化时,就会产生相应的事件。
三、Lifecycle基本使用
1、gradle导入lifecycle
直接导入androidx.lifecycle的最新稳定版本2.5.1
implementation 'androidx.lifecycle:lifecycle-common:2.5.1'
2、自定义MainLifecycle
第一种方式是一种官方已经废弃的方式。实现LifecycleObserver接口,并自定义生命周期回调的方法,然后通过注解的方式实现生命周期的绑定和监听:
package com.example.jetpackdemo.lifecycle;
import android.util.Log;
import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleObserver;
import androidx.lifecycle.OnLifecycleEvent;
public class MainLifecycle implements LifecycleObserver {
private static final String TAG = "MainLifeCycle";
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
void onCreate() {
Log.d(TAG, "onCreate");
}
@OnLifecycleEvent(Lifecycle.Event.ON_START)
void onStart() {
Log.d(TAG, "onStart");
}
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
void onResume() {
Log.d(TAG, "onResume");
}
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
void onPause() {
Log.d(TAG, "onPause");
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
void onStop() {
Log.d(TAG, "onStop");
}
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
void onDestroy() {
Log.d(TAG, "onDestroy");
}
}
上面这种方式官方已经废弃了不推荐使用,第二种方式则是实现DefaultLifecycleObserver接口:
package com.example.jetpackdemo.lifecycle;
import android.util.Log;
import androidx.annotation.NonNull;
import androidx.lifecycle.DefaultLifecycleObserver;
import androidx.lifecycle.LifecycleOwner;
public class SimpleLifecycle implements DefaultLifecycleObserver {
private static final String TAG = "SimpleLifecycle";
@Override
public void onCreate(@NonNull LifecycleOwner owner) {
DefaultLifecycleObserver.super.onCreate(owner);
Log.d(TAG, "onCreate");
}
@Override
public void onStart(@NonNull LifecycleOwner owner) {
DefaultLifecycleObserver.super.onStart(owner);
Log.d(TAG, "onStart");
}
@Override
public void onResume(@NonNull LifecycleOwner owner) {
DefaultLifecycleObserver.super.onResume(owner);
Log.d(TAG, "onResume");
}
@Override
public void onPause(@NonNull LifecycleOwner owner) {
DefaultLifecycleObserver.super.onPause(owner);
Log.d(TAG, "onPause");
}
@Override
public void onStop(@NonNull LifecycleOwner owner) {
DefaultLifecycleObserver.super.onStop(owner);
Log.d(TAG, "onStop");
}
@Override
public void onDestroy(@NonNull LifecycleOwner owner) {
DefaultLifecycleObserver.super.onDestroy(owner);
Log.d(TAG, "onDestroy");
}
}
3、添加Observer
通过上面的步骤,实际上就是创建了一个观察者,而被观察者实际上就是LifecycleOwner。Activity和fragment都实现了LifecycleOwner接口:
LifecycleOwner接口只有一个getLifecycle方法:
因此,我们在Activity的onCreate中去 添加Observer,实现对当前Activity生命周期的监听:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityMainBinding binding = DataBindingUtil.setContentView(this,R.layout.activity_main);
getLifecycle().addObserver(new SimpleLifecycle());
initInfo(binding);
}
以下是Activity生命周期切换过程中,SimpleLifecycle打印的日志:
四、Lifecycle扩展
在实际的项目中,我们不仅仅有一个Activity,那么,如果我们想监听多个Activity的生命周期,该怎么做呢?
1、多Activity生命周期监听
上面我们也提到了,Lifecycle本身的实现其实就是观察者模式。那么,我们可以让观察者去观察多个Activity的生命周期。如下示例,我新创建一个SecondActivity,在MainActivity中点击一个按钮打开SecondActivity,只需要在SecondActivity的onCreate中添加Observer即可:
public class SecondActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
getLifecycle().addObserver(new SimpleLifecycle());
}
}
启动MainActivity,打开SecondActivity,我们看下日志:
可能大家跟我一样,看这个日志觉得有点乱,到底是哪个Activity?没错,添加了对多个Activity的监听后,如果不区分Activity,看这个日志确实是难受。接下来,我们优化这个问题。
2、区分具体的Activity
其实也挺简单,上面我们也提到过,Activity和Fragment本身也是实现了LifecycleOwner接口,而DefaultLifecycleObserver的那些方法都只有一个参数DefaultLifecycleObserver,我们可以直接去获取owner的名字:
package com.example.jetpackdemo.lifecycle;
import android.util.Log;
import androidx.annotation.NonNull;
import androidx.lifecycle.DefaultLifecycleObserver;
import androidx.lifecycle.LifecycleOwner;
public class SimpleLifecycle implements DefaultLifecycleObserver {
private static final String TAG = "SimpleLifecycle";
@Override
public void onCreate(@NonNull LifecycleOwner owner) {
DefaultLifecycleObserver.super.onCreate(owner);
Log.d(TAG, "onCreate:" + owner.getClass().getSimpleName());
}
@Override
public void onStart(@NonNull LifecycleOwner owner) {
DefaultLifecycleObserver.super.onStart(owner);
Log.d(TAG, "onStart:" + owner.getClass().getSimpleName());
}
@Override
public void onResume(@NonNull LifecycleOwner owner) {
DefaultLifecycleObserver.super.onResume(owner);
Log.d(TAG, "onResume:" + owner.getClass().getSimpleName());
}
@Override
public void onPause(@NonNull LifecycleOwner owner) {
DefaultLifecycleObserver.super.onPause(owner);
Log.d(TAG, "onPause:" + owner.getClass().getSimpleName());
}
@Override
public void onStop(@NonNull LifecycleOwner owner) {
DefaultLifecycleObserver.super.onStop(owner);
Log.d(TAG, "onStop:" + owner.getClass().getSimpleName());
}
@Override
public void onDestroy(@NonNull LifecycleOwner owner) {
DefaultLifecycleObserver.super.onDestroy(owner);
Log.d(TAG, "onDestroy:" + owner.getClass().getSimpleName());
}
}
再来看下Log:
OK,这样看着就比较舒服了,我们可以清楚的看到:从启动MainActivity,再打开SecondActivity的整个生命周期的流程。
本篇总结了对Lifecycle的基本使用,也在此基础上稍微扩展了一下,如何实现对多个activity生命周期的监听,以及如何区分具体的Activity,相信大家也对Lifecycle的使用有了一些了解。如果大家觉得还不错,也希望可以点个赞支持下。