一、前言

为了使开发者能尽快在 Android 平台上开发出高质量的项目,Android 官方推出了 Android Jetpack 项目,旨在从基础,架构,行为以及界面 4 大方面体系化地为我们提供组件级别的支持。当然,在实际开发过程中,我们的旧项目甚至是新项目都不可能完全采用其全部的解决方案。一般来说我们都是各取所需,汲长补短。

我最关注的是其所提供的架构方面的组件, 这一套架构的核心组件Lifecycles、LiveData、ViewModel、Room也被称之为 AAC。通过 AAC + DataBinding+ MVVM 所打造的应用的基础架构,就目前的实践来看,是特别简洁且高效的。对于中小型项目来说,是优秀的可选方案之一。而今天我们要了解的就是 Lifecycles 组件。

二、Lifecyces 基础

Lifecyces 根据官方的解释,是一个生命可感知的组件。如下是官方关于 Lifecycels 的一张功能说明图。

d108f83be425

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 了。

三、原理简析

d108f83be425

Lifecycels 工作原理图

从原理图上看,以 LifecycleRegistry 为中心,其拥有一个 LifecycleOwner 实例和多个 LifecycleObserver 实例。由 LifecycleOwner 通过 LifecycleRegistry 来 markState ,然后又由其来 dispatch 各个 Event 到所有 LifecycleOwner 的相应事件的方法中。

四、后记

关于 Lifecycles 组件就讲这么多,暂时也不打算涉及到其源码的分析。

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

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐