LifeCycle 简介
在许多情况下我们需要感知页面的声明周期变化,例如 MVVM 架构中有时候 ViewModel 层需要感知 View 层的生命周期,以往的方式是在 View 层的各个生命周期回调函数中调用 ViewModel 中定义的各个方法。因此,Google 推出了 LifeCycle 组件,用于 Activity 等组件的生命周期,例如在上述情景下,ViewModel 层可以通过 LifeCycle 组件感知到 View 层的声明周期变化,从而主动做出响应。
LifeCycle 介绍
LifeCycle 通过观察者模式实现对页面生命周期的监听,它有以下两个接口:
LifeCycleOwner(被监听者)
实现 LifeCycleOwner 接口的是生命周期的拥有者,可以是 Activity、Fragment、Service 和 Application。LifeCycleOwner 接口的源码如下所示:
public interface LifecycleOwner {
/**
* Returns the Lifecycle of the provider.
*
* @return The lifecycle of the provider.
*/
@NonNull
Lifecycle getLifecycle();
}
从源码可以看到 LifeCycleOwner 中只有一个 getLifecycle() 方法,用于获取 LifeCycleRegistry。
查看 Activity 类的源码可发现其继承树中继承了一个 ComponentActivity 类,该类实现了 LifeCycleOwner 接口:
public class ComponentActivity extends androidx.core.app.ComponentActivity implements
LifecycleOwner,
ViewModelStoreOwner,
HasDefaultViewModelProviderFactory,
SavedStateRegistryOwner,
OnBackPressedDispatcherOwner {
...
private final LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this);
@NonNull
@Override
public Lifecycle getLifecycle() {
return mLifecycleRegistry;
}
...
}
查看 Activity 类继承树中的 FragmentActivity 的源码,可以看到 LifeCycleRegistry 在各个生命周期回调中进行了注册(篇幅限制,只展示其中两个回调):
public class FragmentActivity extends ComponentActivity implements
ActivityCompat.OnRequestPermissionsResultCallback,
ActivityCompat.RequestPermissionsRequestCodeValidator {
...
final LifecycleRegistry mFragmentLifecycleRegistry = new LifecycleRegistry(this);
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
mFragmentLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_CREATE);
}
protected void onDestroy() {
super.onDestroy();
...
mFragmentLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_DESTROY);
}
...
}
因此当我们需要监听 Activity 的生命周期时,我们只需要实现监听者部分的代码就可以。
LifeCycleObserver(监听者)
实现 LifeCycleObserver 接口的是需要感知生命周期的类、组件等。 LifeCycleObserver 接口的源代码如下:
@SuppressWarnings("WeakerAccess")
public interface LifecycleObserver {
}
因此我们在实现此接口的时候不需要实现特定方法,而是通过注解来实现对生命周期的监听,具体的实现方式如下:
public class MyLifeCycleObserver implements LifecycleObserver {
private static final String TAG = "MyLifeCycleObserver";
public MyLifeCycleObserver(){};
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
public void activityCreate(){
Log.d(TAG, "activityCreate");
}
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
public void activityDestroy(){
Log.d(TAG, "activityDestroy");
}
}
观察者与监听者绑定
在需要监听的页面实现绑定,例如实现上述 MyLifeCycleObserver 与 MainActivity 的绑定,只需要在 MainActivity 的 onCreate() 方法中添加以下代码即可:
getLifecycle().addObserver(new MyLifeCycleObserver());