一、前言

为了使开发者能尽快在 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 组件就讲这么多,暂时也不打算涉及到其源码的分析。

最后,感谢你能读到并读完此文章。受限于作者水平有限,如果存在错误或者疑问都欢迎留言讨论。如果我的分享能够帮助到你,也请记得帮忙点个赞吧,鼓励我继续写下去,谢谢。