一 前言
上一篇文章中介绍了jetpack是什么,这次来介绍一下jetpack中的其中一个组件Lifecycle的基本使用;Lifecycle用于帮助开发者管理Activity和Fragment 的生命周期,由于Lifecycle是LiveData和ViewModel的基础,所以需要先学习它。
二 为何要使用Lifecycle
在应用开发中,对Activity和Fragment的生命周期相关代码的使用必不可少,假如有一个监听器,需要在各个生命周期阶段调用相对应的方法,那么就需要在每一个Acticity和Fragment中去一一调用,这样就会让代码变得臃肿不堪,让代码变得难以维护,而Lifecycle就是为了解决这个问题的,我们先来看看下面的例子:
public class MainActivity extends AppCompatActivity {
private MyListener myListener;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myListener = new MyListener(MainActivity.this);
}
@Override
protected void onStart() {
super.onStart();
myListener.start();
}
@Override
protected void onStop() {
super.onStop();
myListener.stop();
}
}
class MyListener {
public MyListener(Context context) {
...
}
void start() {
...
}
void stop() {
...
}
}
再看一下MVP常见的情况:
public class MainActivity extends AppCompatActivity {
private MyPresenter myPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myPresenter = new MyPresenter();
}
@Override
protected void onResume() {
super.onResume();
myPresenter.onResume();
}
@Override
protected void onPause() {
super.onPause();
myPresenter.onPause();
}
}
class MyPresenter{
void onResume() {
...
}
void onPause() {
...
}
}
这两个例子也充分说明了问题,多个组件在Activity的生命周期方法里回调,很显然是不明智的,这时候我们就要一个能管理Activity和Fragment生命周期的库——Lifecycle
2.2 如何使用Lifecycle
依赖Lifecycle库
implementation 'androidx.appcompat:appcompat:1.2.0'
implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
Lifecycle基本用法:
先列举一个Lifecycle一个简单的例子
public class MyObserver implements LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
public void connectListener() {
...
}
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
public void disconnectListener() {
...
}
}
myLifecycleOwner.getLifecycle().addObserver(new MyObserver());//1
新建了一个MyObserver类,他实现了LifecleObserver接口,此时MyObserver成为了一个Lifecycle的观察着。然后在注释1处,LifecycleOwner也是一个接口,其内部只有一个方法getLifecycle(),用来获取Lifecycle。在此处将MyObserver添加到lifecycler里,当lifecycler生命周期发生变化时,MyObserver就会监听到。如果使用是Java8 ,那么可以使用DefaultLifecycleObserver来替代LifecycleObserver:
class MyObserver implements DefaultLifecycleObserver {
@Override
public void onCreate(LifecycleOwner owner) {
...
}
}
三 Lifecycle应用举例
接着一次在Activity和MVP架构中举例使用:
3.1 Activity中使用
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getLifecycle().addObserver(new MyObserver());//1
}
public class MyObserver implements LifecycleObserver{
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
void onResume(){
Log.d(TAG, "Lifecycle call onResume");
}
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
void onPause(){
Log.d(TAG, "Lifecycle call onPause");
}
}
@Override
protected void onResume() {
super.onResume();
Log.d(TAG, "onResume");
}
@Override
protected void onPause() {
super.onPause();
Log.d(TAG, "onPause");
}
}
Activity和fragment默认实现了LifecycleOwner接口,所以在注视1处可以直接调用getLifecycle()方法获取lifecycle。这样MyObserver就可以观察到MainActivity的生命周期了。可以理解成LifecycleOwner是被观察着,MainActivity默认实现了LifecycleOwner接口,也就是MainActivity是被观察者。
运行结果:
D/MainActivity: onResume
D/MainActivity: Lifecycle call onResume
D/MainActivity: Lifecycle call onPause
D/MainActivity: onPause
3.2 MVP架构中的使用
public class MyPresenter implements IPresenter {
private static final String TAG = "test";
@Override
public void onResume() {
Log.d(TAG, "Lifecycle call onResume");
}
@Override
public void onPause() {
Log.d(TAG, "Lifecycle call onPause");
}
}
interface IPresenter extends LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
void onResume();
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
void onPause();
}
public class MyActivity extends AppCompatActivity {
private LifecycleRegistry lifecycleRegistry;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
lifecycleRegistry = new LifecycleRegistry(this);
lifecycleRegistry.markState(Lifecycle.State.CREATED);
}
@Override
public void onStart() {
super.onStart();
lifecycleRegistry.markState(Lifecycle.State.STARTED);
}
@NonNull
@Override
public Lifecycle getLifecycle() {
return lifecycleRegistry;
}
}