欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Android architecture components学习笔记1-Lifecycle源码分析

程序员文章站 2022-05-14 15:25:57
...

我们知道在安卓的开发中,出现过很多的架构,从最开始的直接4大组件开撸的类mvc,到后来的mvp,mvvm。有鉴于此,google也终于在2017年的IO开发大会上推出了Android Architecture Components(AAC)来帮助Android开发者构建更好的app架构。

AAC简介

关于AAC架构,没有比官方提供的整体架构图更能说明了,我们先看官方架构图。
Android architecture components学习笔记1-Lifecycle源码分析

可以看到,AAC实际上是一个mvvm架构,由activity,fragment充当view,ViewModel充当控制层,Repository充当数据源。那么从图上看,AAC架构和我们常用的mvp架构的最大区别在哪里呢?个人认为最主要的区别有2点。

–使用ViewModel代替了Present。

–VIew和ViewModel单向依赖。

我们都知道,在mvp中,view和Present会互相持有对方的引用,已达到View和present交互的目的,但是在AAC中,只有View持有ViewModel的引用,而ViewModel并不持有View的引用,这是如何做到的呢?这就是图中的LiveData的功劳啦,我们之后介绍。

AAC组件简介

–LifeCycle

生命周期管理(Lifecycles)组件,帮助开发者创建 “可感知生命周期的” 组件,让其自己管理自己的生命周期,从而减少内存泄露和崩溃的可能性。生命周期库是其他架构组件(如 LiveData)的基础。
android.arch.lifecycle 包提供了类和接口允许你构建生命周期感知(lifecycle-aware)的组件——可以基于当前activity或fragment生命周期自动调节它们的行为的组件。

–LiveData

LiveData 是一款基于观察者模式的可感知生命周期的核心组件。LiveData 为界面代码 (Observer)的监视对象 (Observable),当 LiveData 所持有的数据改变时,它会通知相应的界面代码进行更新。同时,LiveData 持有界面代码 Lifecycle 的引用,这意味着它会在界面代码(LifecycleOwner)的生命周期处于 started 或 resumed 时作出相应更新,而在 LifecycleOwner 被销毁时停止更新。通过 LiveData,开发者可以方便地构建安全性更高、性能更好的高响应度用户界面。

–ViewModel

ViewModel 将视图的数据和逻辑从具有生命周期特性的实体(如 Activity 和 Fragment)中剥离开来。直到关联的 Activity 或 Fragment 完全销毁时,ViewModel 才会随之消失,也就是说,即使在旋转屏幕导致 Fragment 被重新创建等事件中,视图数据依旧会被保留。ViewModels 不仅消除了常见的生命周期问题,而且可以帮助构建更为模块化、更方便测试的用户界面。

上面三个组件的介绍来自官方文档,初看可能不明觉厉,不过不要紧,下面我们将分别进行介绍。

LifeCycle简介

LifeCycle可以说是AAC架构的一个核心组件,它的作用是可以让我们创建具有生命周期的对象,这是什么意思呢?大家都知道,我们平常使用的Activity,fragment等,都是具有生命周期的,而且它们的生命周期都是由系统进行管理的,我们app无法对其进行控制,而是只能收到生命周期变化的回调,比如onCreate,onStart等方法。作为一个开发者,我们必须遵守这些生命周期的规则,否则就可能出现应用奔溃或者内存泄漏的情况。而我们的LifeCycle包就是为了让我们自己创建的对象也能感受到android组件生命周期而诞生的。参考官方介绍和教程
https://developer.android.google.cn/topic/libraries/architecture/lifecycle.html

如何让自己创建的对象感知Activity/fragment生命周期

设想一下,如果让我们自己设计,我们要如何让自建对象感知activity或者fragment的生命周期呢?我觉得这个问题并不困难,在mvp的某一种实现中,我们为了让Present能够感知到Activity的生命周期,就采用了下面的方法来解决这个问题。示例代码如下:

public class Present {
    public void onCreate(){
    }

    public void onStart(){
    }

    public void onStop(){
    }

    public void onDestroy(){   
    }
}

我们先在Present中增加需要的各个回调方法,之后Activity持有Present的引用,并在Activity的生命周期方法中,调用Present的方法,这样我们的Present也有了生命周期。

public class MainActivity extends AppCompatActivity {

    private Present present = new Present();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        present.onCreate();
    }

    @Override
    protected void onStart() {
        super.onStart();
        present.onStart();
    }

    @Override
    protected void onStop() {
        super.onStop();
        present.onStop();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        present.onDestroy();
    }
}

这个例子看起来也很好的实现了需求,但是毫无扩展性,比如我还有另一个对象B也需要声明周期或者其他Activity中的对象C也需要声明周期呢,难道我们要把这段代码写很多遍么,另外如果我们现在需要Activity当前的状态,比如是否执行过onResume,或者是否执行过onStop应该怎么做呢,为了满足这些需求,我们决定把这个例子改良一下。

首先,我们把Activity的生命周期事件抽象成一个接口,其他的类继承该接口就可以接收到Activity的生命周期事件。

public interface ILifecycle {
    void onCreate();
    void onStart();
    void onResume();
    void onPause();
    void onStop();
    void onDestroy();
}

其次我们抽象出一个BaseActivity,用它来管理所有需要生命周期事件的对象,并分发生命周期事件。同时记录Activity的生命周期状态。 可以看到我们采用了很经典的观察者模式向生命周期对象分发Activity的生命周期事件,代码比较好看懂。

public class BaseActivity extends AppCompatActivity{

    private List<ILifecycle> lifes = new ArrayList<>();
    protected String mLifeCycle = "INIT";

    public String getmLifeCycle() {
        return mLifeCycle;
    }

    protected void addLifecycle(ILifecycle cycle){
        if(!lifes.contains(cycle)){
            lifes.add(cycle);
        }
    }

    protected void removeLifecycle(ILifecycle cycle){
        if(lifes.contains(cycle)){
            lifes.remove(cycle);
        }
    }

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        for(ILifecycle cycle:lifes){
            cycle.onCreate();
        }
        mLifeCycle = "CREATE";
    }

    @Override
    protected void onStart() {
        super.onStart();
        for(ILifecycle cycle:lifes){
            cycle.onStart();
        }
        mLifeCycle = "START";
    }

    @Override
    protected void onResume() {
        super.onResume();
        for(ILifecycle cycle:lifes){
            cycle.onResume();
        }
        mLifeCycle = "RESUME";
    }

    @Override
    protected void onPause() {
        super.onPause();
        for(ILifecycle cycle:lifes){
            cycle.onPause();
        }
        mLifeCycle = "PAUSE";
    }

    @Override
    protected void onStop() {
        super.onStop();
        for(ILifecycle cycle:lifes){
            cycle.onStop();
        }
        mLifeCycle = "STOP";
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        for(ILifecycle cycle:lifes){
            cycle.onDestroy();
        }
        mLifeCycle = "DESTROY";
    }
}

最后,让我们的Present实现ILifecycle接口,MainActivity继承自BaseActivity基类,并在onCreate方法中将Prenset加入观察,即完成了Present对象对生命周期事件的监听。

public class Present implements ILifecycle{
}
public class MainActivity extends BaseActivity {
    private Present present = new Present();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        addLifecycle(present);
        super.onCreate(savedInstanceState);
    }
}

Lifecycle的例子

说了这么多,终于到了我们今天的主角,我们先直接来看看,使用Lifecycle的话,我们之前的例子要怎么写。首先,我们实现LifecycleObserver接口,使用注解标明我们需要的生命周期事件,这里我们选择接受onCreate事件,当Activity的onCreate被调用时,我们的Present的onCreate也会被调用。

public class Present implements LifecycleObserver{
    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
    void onCreate(){
    }
}

然后,我们继承自AppCompatActivity,并在onCreate中完成注册即可,是不是超级简单。

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getLifecycle().addObserver(new Present());
    }
}

Lifecycle生命周期

lifecycle使用了2个枚举来跟踪它所关联的组件的生命周期

–Event 事件

从组件或者Lifecycle类分发出来的生命周期,它们和Activity/Fragment生命周期的事件一一对应。(ON_CREATE,ON_START,ON_RESUME,ON_PAUSE,ON_STOP,ON_DESTROY)

–State 状态

当前组件的生命周期状态(INITIALIZED,DESTROYED,CREATED,STARTED,RESUMED)

它们的转换关系见下面的官方说明
Android architecture components学习笔记1-Lifecycle源码分析

Lifecycle主要类

Lifecycle的实现不算复杂,主要的类如下图所示
Android architecture components学习笔记1-Lifecycle源码分析
可以看到,主要有3大核心模块。LifecycleObserver及其子类为被观察者,负责接收生命周期事件,我们自定义的接收器就需要继承自LifecycleObserver接口;Lifecycle为被被观察者,负责从Activity,fragment接收生命周期事件,并分发到观察者中;LifecycleOwner的职责很简单,仅仅是提供了Lifecycle对象,我们使用的Support包下的Fragment和AppCompatActivity都实现了该接口。

LifecycleObserver

我们的Present对象实现了LifecycleObserver接口,只有实现该接口的对象才能够收到生命周期事件,我们来看看该接口究竟是怎么回事呢?

/**
 * Marks a class as a LifecycleObserver. It does not have any methods, instead, relies on
 * {@link OnLifecycleEvent} annotated methods.
 */
public interface LifecycleObserver {
}

出乎意料的是,该接口并没有任何内容,源码注释告诉我们,需要监听哪个生命周期,使用OnLifecycleEvent注解标明即可。我们来看看OnLifecycleEvent注解的内容。

@SuppressWarnings("unused")
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface OnLifecycleEvent {
    Lifecycle.Event value();
}

可以看到,该注解是一个运行时注解,可以使用在方法体上,返回的Lifecycle.Event对象就是我们上一节提到的Event事件。那么为什么使用该注解标识的方法就会被调用呢,我们之后分析。

LifecycleOwner

LifecycleOwner是一个接口,它只有一个方法getLifecycle用于获取Lifecycle对象

public interface LifecycleOwner {
    Lifecycle getLifecycle();
}

我们来看看有哪些类实现了该接口以方便我们使用Lifecycle,可以看到,我们的support包下的Fragment直接实现了该接口,并提供了一个Lifecycle的具体实现类LifecycleRegistry。

public class Fragment implements LifecycleOwner{
    //Lifecycle的实现类LifecycleRegistry
    LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this);

    @Override
    public Lifecycle getLifecycle() {
        //覆盖LifecycleOwner接口的getLifecycle方法
        //并返回LifecycleRegistry
        return mLifecycleRegistry;
    }
}

继续查看我们发现support包下的SupportActivity实现了该接口,同样提供了一个LifecycleRegistry。而我们发现AppCompatActivity最终也继承自SupportActivity,因此在我们平时的开发中,只要继承自Support包的Fragment和AppCompatActivity就可以方便的使用Lifecycle,而不用额外的继承自某个特定的基类Activity或者fragment,是不是很方便。

public class SupportActivity extends Activity implements LifecycleOwner{
    private LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this);

    @Override
    public Lifecycle getLifecycle() {
        return mLifecycleRegistry;
    }
}

Lifecycle

该类是一个抽象类,扮演了一个被观察者的角色,从Activity/fragment中接收事件,并分发到观察者LifecycleObserver,我们来看具体代码。

public abstract class Lifecycle {
    //添加观察者
    public abstract void addObserver(LifecycleObserver observer);
    //移除观察者
    public abstract void removeObserver(LifecycleObserver observer);
    //获取当前的State
    public abstract State getCurrentState();
    //Lifecycle生命周期的Event事件
    public enum Event {
        ON_CREATE,
        ON_START,
        ON_RESUME,
        ON_PAUSE,
        ON_STOP,
        ON_DESTROY,
        ON_ANY
    }
    //Lifecycle生命周期的State状态
    public enum State {
        DESTROYED,
        INITIALIZED,
        CREATED,
        STARTED,
        RESUMED;
    }
}

该类是一个抽象类,其中的addObserver,removeObserver方法是观察者模式当中典型的添加,删除观察者方法。而其内部类Event和State就是我们之前说过的Lifecycle的Event事件和State状态。

LifecycleRegistry

该类为Lifecycle的实现类,添加,移除观察者,以及分发生命周期事件到LifecycleObserver中都是由该类实现的,我们之后会进行重点分析。

Lifecycle流程分析

我们从以下几个方面来分析Lifecycle的工作过程。

1,fragment/activity生命周期事件如何通知LifecycleRegistry
2,如果添加和移除LifecycleObserver到LifecycleRegistry中?
3,LifecycleRegitstry如何通知LifecycleObserver?

Fragment通知LifecycleRegistry

public class Fragment implements LifecycleOwner{
    //创建LifecycleRegistry对象,该对象就是LifecycleOwner的实现类。
    LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this);

    @Override
    public Lifecycle getLifecycle() {
        return mLifecycleRegistry;
    }

     void performCreate(Bundle savedInstanceState) {
        //...无关代码
        //先执行onCreate
        onCreate(savedInstanceState);
        //分发ON_CREATE这个Event给LifecycleRegistry
        mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_CREATE);
    }

     void performDestroy() {
        //...无关代码
        //先分发ON_DESTROY事件
        mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_DESTROY);
        //后执行onDestroy方法
        onDestroy();
    }
    //省略onStart,onResume,onPause,onStop等事件的分发,和上面一致。
}

可以看到,Fragment生命周期通知Lifecycle的过程非常直接,fragment中创建了LifecycleRegistry对象,在fragment的生命周期中直接调用了LifecycleRegistry的handleLifecycleEvent方法,这样就将生命周期通知到了Lifecycle。

Activity通知LifecycleRegistry

看完上面Fragment生命周期分发的过程,大家可能觉得Activity的过程都不用看了吧,毕竟照着上面来一遍,生命周期事件也就分发出去了,如果你是这么想的,那可就错了,我们来看代码。

public class SupportActivity extends Activity implements LifecycleOwner {

    private LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this);

    @Override
    public Lifecycle getLifecycle() {
        return mLifecycleRegistry;
    }

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //在本Activity添加一个ReportFragment,使用该Fragment来跟踪
        //Activity的生命周期
        ReportFragment.injectIfNeededIn(this);
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        //将Lifecycle的状态修改为CREATE
        mLifecycleRegistry.markState(Lifecycle.State.CREATED);
        super.onSaveInstanceState(outState);
    }
}

可以看到,google竟然不按套路出牌,虽然创建了LifecycleRegistry,但是在Activity的生命周期方法中使用它传递事件,那么生命周期事件如何创建了,答案就是onCreate中的ReportFragment,google使用它来感知Activity的生命周期,并传递生命周期事件到Lifecycle中,我们来看看ReportFragment吧。

ReportFragment传递生命周期事件

public class ReportFragment extends Fragment {
    private static final String REPORT_FRAGMENT_TAG = "android.arch.lifecycle"
            + ".LifecycleDispatcher.report_fragment_tag";

    public static void injectIfNeededIn(Activity activity) {
        FragmentManager manager = activity.getFragmentManager();
        //创建自身并添加到宿主Activity中
        if (manager.findFragmentByTag(REPORT_FRAGMENT_TAG) == null) {
            manager.beginTransaction().add(new ReportFragment(), REPORT_FRAGMENT_TAG).commit();
            manager.executePendingTransactions();
        }
    }

    static ReportFragment get(Activity activity) {
        //获取自身的实例
        return (ReportFragment) activity.getFragmentManager().findFragmentByTag(
                REPORT_FRAGMENT_TAG);
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        //分发ON_CREATE事件
        dispatch(Lifecycle.Event.ON_CREATE);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        //分发ON_DESTROY事件
        dispatch(Lifecycle.Event.ON_DESTROY);
    }
    //...其他生命周期事件的分发省略

    private void dispatch(Lifecycle.Event event) {
        Activity activity = getActivity();
        //如果宿主Activity继承了LifecycleOwner,则分发生命周期事件
        if (activity instanceof LifecycleOwner) {
            Lifecycle lifecycle = ((LifecycleOwner) activity).getLifecycle();
            if (lifecycle instanceof LifecycleRegistry) {
                ((LifecycleRegistry) lifecycle).handleLifecycleEvent(event);
            }
        }
    }
}

可以看到,我们在Activity的onCreate方法中,将ReportFragment添加进来,之后该Fragment就具有了和宿主Activity一样的生命周期,我们在ReportFragment的生命周期中分发事件到Lifecycle中即可。

那么问题就来了,我们直接在SupportActivity的生命周期方法中,向lifecycle传递事件一样可以达到目的啊,为啥还搞出了一个ReportFragment,感觉很多余啊,google为何要这么做呢?个人推测这个问题的原因和Lifecycle的历史实现有关,我们之后再解释。

将LifecycleObserver添加到Lifecycle中

前面我们介绍了,Lifecycle是基于观察者模式工作的,那么我们是什么时候将观察者注册到Lifecycle中的呢?没错,就是通过下面这个简单的语句,我们就注册了观察者。

 getLifecycle().addObserver(new Present());

通过前面的分析,我们知道,getLifecycle方法获取到的为LifecycleRegistry的实例,我们先来看看LifecycleRegistry中2个很重要的成员变量。

public class LifecycleRegistry extends Lifecycle{
     //Lifecycle自定义的数据结构,我们可以看成HashMap,支持遍历时添加,删除元素。
     private FastSafeIterableMap<LifecycleObserver, ObserverWithState> mObserverMap =
            new FastSafeIterableMap<>();
     //当前的生命周期状态
     private State mState;
}

我们来梳理一下,首先在LifecycleRegistry类中,会使用一个类似LinkedHashMap的结构来保存所有的被观察者,已确保生命周期发生变化时,能够通知LifecycleObserver。
这里有一个注释说明,说的是我们如果按照ob1,ob2的顺序添加了观察者,那么ob1的状态将会大于或等于ob2的状态,这个会有什么影响呢?影响就是启动时,ob1的ON_CREATE,ON_START,ON_RESUME事件会先于Ob2。而停止时,ob2的ON_PAUSE,ON_STOP事件先于ob1。
它的键是我们的观察者LifecycleObserver对象,值是ObserverWithState对象,这个对象其实只是一个简单的对Observer和State的封装,我们看一下他的实现。

static class ObserverWithState {
    //保存当前Observer的状态
    State mState;
    //源Observer的包装类
    GenericLifecycleObserver mLifecycleObserver;

    ObserverWithState(LifecycleObserver observer, State initialState) {
        //生成一个原Observer的包装类
        mLifecycleObserver = Lifecycling.getCallback(observer);
        mState = initialState;
    }
    //该方法将生命周期事件分发到LifecycleObserver中
    void dispatchEvent(LifecycleOwner owner, Event event) {
        State newState = getStateAfter(event);
        mState = min(mState, newState);
        //调用包装类的onStateChanged方法,传递生命周期事件到Observer中
        mLifecycleObserver.onStateChanged(owner, event);
        mState = newState;
    }
}

原来ObserverWithState类的实现很简单,主要就是保存了当前Observer类的状态State,并且使用Lifecycling类的getCallback方法返回了一个LifecycleObserver的真正实现类,该实现类就是之前类图中的ReflectiveGenericLifecycleObserver。

该类的实现原理我们大致说一下,在创建的时候,使用反射扫描我们传入的Observer对象中包含了OnLifecycleEvent注解的方法,将扫描到的方法缓存下来,并在调用GenericLifecycleObserver类的onStateChanged方法时,找到真正的生命周期回调方法并调用。详细代码我们这里就不分析了。

我们继续看关键的addObserver方法

@Override
public void addObserver(LifecycleObserver observer) {
//计算初始状态,如果当前Lifecycle状态不为DESTROYED,我们就设置为初始状态
  State initialState = mState == DESTROYED ? DESTROYED : INITIALIZED;
  ObserverWithState statefulObserver = new ObserverWithState(observer, initialState);
//如果Map中存在observer这个key,我们返回它原来对应的值,否则将该键值对加入map
  ObserverWithState previous = mObserverMap.putIfAbsent(observer, statefulObserver);
//一个observer不能多次加入到同一个Lifecycle中,因此我们这里判断如果它已经加入
//过了,则直接返回,不进行处理。
  if (previous != null) {
      return;
  }
//判断该添加是否可重入,这里和多线程添加Observer有关,正常情况下,我们在主线程中
//添加Observer,该标志永远为false
  boolean isReentrance = mAddingObserverCounter != 0 || mHandlingEvent;
//计算当前Lifecycle的状态
  State targetState = calculateTargetState(observer);
  mAddingObserverCounter++;
//如果我们新添加的观察者的状态小于当前状态,则我们将它迁移到当前状态
//例如当前状态为RESUMED,则Observer将收到ONCREATE ONSTART ONRESUME事件
  while ((statefulObserver.mState.compareTo(targetState) < 0
          && mObserverMap.contains(observer))) {
      //调用ObserverWithState对象的dispatchEvent方法,向真正的Observer发送生命周期事件
      statefulObserver.dispatchEvent(mLifecycleOwner, upEvent(statefulObserver.mState));
      //重新计算当前状态
      targetState = calculateTargetState(observer);
  }
  //该方法我们之后分析
  if (!isReentrance) {
      sync();
  }
  mAddingObserverCounter--;
}

可以看到,该方法大体分为4个步骤,详细流程图如下:
Android architecture components学习笔记1-Lifecycle源码分析
1,计算Observer的初始状态,并创建包装类ObserverWithState。
2,如果全局Map中已经存在该Observer了,直接返回,如果不存在,则加入map中。
3,将Observer的当前状态和Lifecycle的状态进行比较,如果Lifecycle的状态较大,则循环迁徙Observer的状态为和Lifecycle的状态一致。
4,调用sync方法同步所有的Observer对象的生命周期状态,该方法我们之后会进行详细分析

针对第三点举个例子,例如我们在Activity的onResume中添加Observer,则由于Lifecycle的状态为RESUMED,而我们添加的Observer的状态为INIT,那么Observer的状态将依次变为CREATED,STARTED,RESUMED.并受到ON_CREATE ONSTART ONRESUME事件。

LifecycleRegistry分发生命周期事件到LifecycleObserver中

之前我们已经了解到Activity,Fragment通过LifecycleRegistry类的handleLifecycleEvent方法将生命周期事件传递到Lifecycle中,我们接下来就分析该方法,看看Lifecycle怎样将该事件分发到所有的观察者Observer中。

 public void handleLifecycleEvent(Lifecycle.Event event) {
    //1,根据当前事件,获取该事件发生后的状态
    mState = getStateAfter(event);
    //2,这个判断个人理解只有多线程下执行本方法或者addObserver
    //方法才会发生。由于我们基本不会这么用,所以可以跳过。
    if (mHandlingEvent || mAddingObserverCounter != 0) {
        mNewEventOccurred = true;
        // we will figure out what to do on upper level.
        return;
    }
    mHandlingEvent = true;
    //3,执行关键的同步sync方法
    sync();
    mHandlingEvent = false;
}

该方法的实现比较简单,第一步就是根据当前收到的生命周期事件,判断我们之后应处于的状态,我们来看一下getStateAfter的源代码

static State getStateAfter(Event event) {
    switch (event) {
        case ON_CREATE:
        case ON_STOP:
            return CREATED;
        case ON_START:
        case ON_PAUSE:
            return STARTED;
        case ON_RESUME:
            return RESUMED;
        case ON_DESTROY:
            return DESTROYED;
        case ON_ANY:
            break;
    }
    throw new IllegalArgumentException("Unexpected event value " + event);
}

该方法的实现比较简单,对照之前的事件状态转换图,可谓一目了然。

我们回到handleLifecycleEvent方法,该方法的第二步是判断mHandlingEvent 为真或者mAddingObserverCounter不为0,就返回,不执行之后的操作。这2个判断个人理解是为了在addObserver和本方法可能执行在其他线程服务的,因为如果大家都执行在主线程的话,这些判断根本就不会起作用,由于handleLifecycleEvent方法在前面的实现中,一定执行在主线程,所以只有addObserver方法执行在子线程时,这个判断才会起作用。我们暂时忽略这种情况,继续分析。

sync方法

该方法的第三步执行了sync方法,同步所有的观察者状态,我们来分析sync方法。

private void sync() {
    //判断是否同步完成,如果未完成,则同步直到完成为止。
    while (!isSynced()) {
        mNewEventOccurred = false;
        //之前我们说过,排在全局map第一位的状态是最大的,如果我们当前lifecycle
        //状态比它小,那么我们需要回退某些Observer的状态到mState
        if (mState.compareTo(mObserverMap.eldest().getValue().mState) < 0) {
            backwardPass();
        }
        Entry<LifecycleObserver, ObserverWithState> newest = mObserverMap.newest();
        //之前我们说过,排在全局map最后的状态是最小的,如果我们当前lifecycle
        //状态比它大,那么我们需要前进某些Observer的状态到mState
        if (!mNewEventOccurred && newest != null
                && mState.compareTo(newest.getValue().mState) > 0) {
            forwardPass();
        }
    }
    mNewEventOccurred = false;
}

可以看到,sync方法也分为3步
1,如果有Observer处于未同步状态,则继续同步,否则直接返回。
2,使用当前Lifecycle的State和所有Observer中State最大的比较,如果mState较小,说明我们需要递减状态,执行backwardPass方法。例如状态从RESUMED递减到STARTED,事件为ON_PAUSE。
3,使用当前Lifecycle的State和所有Observer中State最小的比较,如果mState较大,说明我们要递增状态,执行forwardPass方法。例如状态从CREATED递增到STARTED,事件为ON_START。

下面我们看一下isSynced方法,可以看到,实现非常简单,去除所有Observer中的最大状态,最小状态,并和Lifecycle的状态进行比较。也就是所有Observer的状态都已经被同步为了Lifecycle的状态,才算同步完成。

private boolean isSynced() {
    if (mObserverMap.size() == 0) {
        return true;
    }
    //获取所有Observer中的最大状态
    State eldestObserverState = mObserverMap.eldest().getValue().mState;
    //获取所有Observer中的最小状态
    State newestObserverState = mObserverMap.newest().getValue().mState;
    //判断Observer中的所有状态都和当前Lifecycle的状态一致了,则说明我们已经同步完成
    return eldestObserverState == newestObserverState && mState == newestObserverState;
}

下面我们在来看一下递增状态的forwardPass方法,该方法首先获取一个按添加Observer顺序的迭代器,然后遍历所有的Observer,对每一个Observer,递增其状态并通过dispatchEvent分发生命周期事件,直到其状态递增到Lifecycle的mState为止。这样既完成了所有Observer的状态同步和事件分发。

private void forwardPass() {
    //获取一个按添加Observer顺序的迭代器
    Iterator<Entry<LifecycleObserver, ObserverWithState>> ascendingIterator =
            mObserverMap.iteratorWithAdditions();
    //遍历所有Observer
    while (ascendingIterator.hasNext() && !mNewEventOccurred) {
        Entry<LifecycleObserver, ObserverWithState> entry = ascendingIterator.next();
        ObserverWithState observer = entry.getValue();
        //如果当前Observer的State小于mState,则递增递增当前状态
        while ((observer.mState.compareTo(mState) < 0 && !mNewEventOccurred
                && mObserverMap.contains(entry.getKey()))) {
            pushParentState(observer.mState);
            //使用我们之前介绍的ObserverWithState类的dispatchEvent方法分发生命周期事件
            //该事件最终会分发到我们的Observer的注解方法中
            observer.dispatchEvent(mLifecycleOwner, upEvent(observer.mState));
            popParentState();
        }
    }
}

至于backwardPass方法,和上面很类似,仅仅是把状态递增改为了递减,这里就不分析了。

到这里,我们就基本分析完了Lifecycle的流程和实现原理,下面我们用一张时序图来作为总结。注意我们只画了addObserver和ON_CREATE事件的传递过程,其他生命周期事件的传递与此类似,就不画了。
Android architecture components学习笔记1-Lifecycle源码分析

Lifecycle设计思路借鉴

分析完了Lifecycle的使用,流程和代码,我们可以思考一下它的设计思路是否能对我们有所借鉴,毕竟对于很多库和框架,我们未必会直接使用到我们自己的项目中,但是阅读了它的设计思路和源码后,想想我们平时的代码设计和实现中有什么可以借鉴的闪光点,如果能把这些设计思路用到我们自己的项目中,也是不错的。我个人以为Lifecycle有以下几个值得借鉴的地方。
1,ReportFragment的使用,Fragment是我们平时常用的ui组件,我们一般用它来组织界面显示,达到复用的目的。而Lifecycle向我们展示了Fragment的另外一种用法,即完全不用来展示界面,而仅仅是嵌入到宿主Activity中,用来传递生命周期。这就告诉我们,fragment可以做的事情不仅仅是展示界面,如果我们想象力丰富一下,它还可以做更多的事情,例如这里的监听Activity生命周期,以及之后要介绍的AAC组件ViewModel中的作为数据容器。
2,注解和反射的使用,我们其实可以在LifecycleObserver接口中定义7个生命周期方法on_create,on_start等,让其他类来实现这些接口,达到不使用注解和反射的目的,但是这样就需要我们覆盖所有的方法,哪怕我们并不需要某些生命周期事件,而Lifecycle为了使用的灵活性。采用了运行时注解和反射的方式,大家都知道,反射对性能是有一定消耗的,所以Lifecycle中对于注解方法采用了一次查找,之后缓存的方式,来应该该问题。大家在使用反射和运行时注解时也可以借鉴。

相关标签: android 源码