一、前言
为了使开发者能尽快在 Android 平台上开发出高质量的项目,Android 官方推出了 Android Jetpack 项目,旨在从基础,架构,行为以及界面 4 大方面体系化地为我们提供组件级别的支持。当然,在实际开发过程中,我们的旧项目甚至是新项目都不可能完全采用其全部的解决方案。一般来说我们都是各取所需,汲长补短。
我最关注的是其所提供的架构方面的组件, 这一套架构的核心组件Lifecycles、LiveData、ViewModel、Room也被称之为 AAC。通过 AAC + DataBinding+ MVVM 所打造的应用的基础架构,就目前的实践来看,是特别简洁且高效的。对于中小型项目来说,是优秀的可选方案之一。而今天我们要了解的就是 Lifecycles 组件。
二、Lifecyces 基础
Lifecyces 根据官方的解释,是一个生命可感知的组件。如下是官方关于 Lifecycels 的一张功能说明图。
从图上来看,其主要包括了状态(states)以及事件(events)两个概念,且状态与事件也是一一对应的。
不过,现在看这张图肯定是有一点懵逼的。我们需要通过分解一下官方的 demo 来直观感受一下 Lifecycles 的用法。其过程如下:
1. 实现LifecycleObserver
首先我们需要实现一个 LifecycleObserver,你可以把它等同于观察者模式中的 Observer。在这里,它就是事件的接受收器。而对于每一个不同的事件,则通过在实现类的方法中添加相应的 @OnLifecycleEvent(Lifecycle.Event.xxx) 注解来实现的。具体代码如下所示。
public class MyObserver implements LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
public void onCreate() {
}
@OnLifecycleEvent(Lifecycle.Event.ON_START)
public void onStart() {
}
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
public void onResume() {
}
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
public void onPause() {
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
public void onStop() {
}
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
public void onDestroy() {
}
}
复制代码
2. 实现 LifecycleOwner
其次就是要实现一个 LifecycleOwner,一般来说就是 Activity 或者 Fragment 来实现是比较合适的。当然,不是这 2 者中的一个,也是可以的,只要你愿意。
public class MyActivity extends Activity implements LifecycleOwner {
@NonNull
@Override
public Lifecycle getLifecycle() {
return null;
}
}
复制代码
3. 向 LifecycleOwner 注册 LifecycleObserver,建立起两者之间的连接
有了接收事件的观察者/接收者,也有了发送事件的生命周期拥有者/发送者,其不可能平白无故的就建立起连接的。因此,我们需要一个连接者——LifecycleRegistry。一般来说,我们在实现了 LifecycleOwner 的 Activity 中声明它的变量,并在 onCreate() 方法中实例化。然后再通过变量向其添加 LifecycleObserver。如下代码所示。
public class MyActivity extends Activity implements LifecycleOwner {
private LifecycleRegistry mLifecycleRegistry;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mLifecycleRegistry = new LifecycleRegistry(this);
getLifecycle().addObserver(new MyObserver());
}
@NonNull
@Override
public Lifecycle getLifecycle() {
return mLifecycleRegistry;
}
}
复制代码
4. mark 状态,"发送"事件
接下来,我们需要在其生命周期的方法里,mark 出生命周期的状态以使得其可以产生一个对应的事件发送到 LifecycleObserver 相应的方法上。如下代码所示。
public class MyActivity extends Activity implements LifecycleOwner {
private LifecycleRegistry mLifecycleRegistry;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mLifecycleRegistry = new LifecycleRegistry(this);
mLifecycleRegistry.markState(Lifecycle.State.CREATED);
}
@Override
public void onStart() {
super.onStart();
mLifecycleRegistry.markState(Lifecycle.State.STARTED);
}
......
......
@NonNull
@Override
public Lifecycle getLifecycle() {
return mLifecycleRegistry;
}
}
复制代码
通过以上 4 个步骤后,以后再也不用逐个逐个在生周期里面去调用相应的 Listener 或者 Controller 了。
三、原理简析
从原理图上看,以 LifecycleRegistry 为中心,其拥有一个 LifecycleOwner 实例和多个 LifecycleObserver 实例。由 LifecycleOwner 通过 LifecycleRegistry 来 markState ,然后又由其来 dispatch 各个 Event 到所有 LifecycleOwner 的相应事件的方法中。
四、后记
关于 Lifecycles 组件就讲这么多,暂时也不打算涉及到其源码的分析。
最后,感谢你能读到并读完此文章。受限于作者水平有限,如果存在错误或者疑问都欢迎留言讨论。如果我的分享能够帮助到你,也请记得帮忙点个赞吧,鼓励我继续写下去,谢谢。