源码解析——LiveData & Lifecycles 完整体系详解

LiveData 作为 Jetpack 的一部分,扛着 “告知界面视图发生数据变化” 的责任,常与 Lifecycles 联合使用用于数据层驱动视图层作出变化的手段。随着项目迭代,我们的项目 MVP 架构中 rxjava 驱动更新视图演化成 MVVM 架构中 rxjava + LiveData + Lifecycles 组合,rxjava 仅仅作为数据源产生-处理的手段,最后输出到 LiveData 由其根据 Lifecycles 的生命感知作出对 UI 调整。 当然,rxjava + LiveData + Lifecycles + DataBinding 则可以进一步进行数据视图双绑定,也一直在尝试中。

LiveData + Lifecycles 未来依然作为数据层通知视图更改的手段,对于项目架构的重要角色,深入理解并熟悉运用是必要的,尤其是在 codeReview 上可以基于更多项目代码的改进,提升代码质量。

针对 LiveData + Lifecycles 体系,本文会围绕以下几点展开,顺着我的逻辑对整个体系进行掌握,相信你可以对整个体系由更完整的理解。

我希望你已经实践过 LiveData 并希望进一步了解更多细节。

在此,先看一张整个体系的类图结构,下面任何篇章的内容都可以回归到这张结构图。整个体系可以分割为五大部分,前四部分是核心的逻辑,形成整个体系的闭环,最后一部分是扩展思考,留给读者自行思考。

  • LiveData 如何接收并分发数据 ?
  • Observer 如何关联具有生命周期特征的角色,怎么接收数据 ?
  • 谁是拥有 “生命周期特征” 的角色?
  • Activity/Fragment 是如何成为 LifecycleOwner?
  • 扩展思考

LiveData 如何接收并分发数据

LiveData 既是一个数据接收者,也是一个数据分发者。

数据接收的方法有两个 setValue 和 postValue。唯一差别在于,postValue 会通过 handler 手段在主线程调用 setValue,并通过 对象锁 保证数据接收的同步性。

@MainThread
protected void setValue(T value) {
    //检测当前是否是在主线程,不是则报异常
    assertMainThread("setValue");
    //修改次数+1
    mVersion++;
    //赋值
    mData = value;
    dispatchingValue(null);
}

protected void postValue(T value) {
    boolean postTask;
    synchronized (mDataLock) {	
        //post之前先上锁,并且判断当前是否处于设置数据状态
        postTask = mPendingData == NOT_SET;
        mPendingData = value;   //保存临时数据
    }
    //在mPendingData != NOT_SET时,即处于数据设置中,则return,保证数据接收的同步性
    if (!postTask) {
        return;
    }
    ArchTaskExecutor.getInstance().postToMainThread(mPostValueRunnable);
}

private final Runnable mPostValueRunnable = new Runnable() {
    @Override
    public void run() {
        Object newValue;
        synchronized (mDataLock) {	
            //主线程同步获取到临时保存的数据
            newValue = mPendingData;
            //设置为空闲状态
            mPendingData = NOT_SET;
        }
        //noinspection unchecked
        setValue((T) newValue);
    }
};

在 setValue 保存了当前接收的 value 对象之后,mVersion 递增加一,接着进行数据分发。mVersion 实际上表示的是 LiveData 当前接收到的数据的 “新鲜程度”。mVersion 值越大数据就越新,这个 “新鲜程度” 对比的是后面 Observer 已经接收的数据。

在看分发逻辑之前,有两个比较关键的变量需要先理解好

  • mDispatchingValue 表示当前 LiveData 是否正在分发数据
  • mDispatchInvalidated 表示当前 LiveData 当前分发是否无效,如果当前分发无效则需要重新分发

为什么 LiveData 当前分发会无效? 实际上是因为,LiveData 分发是一个针对特定 observer 或遍历所有 Observer 并逐个分发的过程。当分发到中间时,突然有新的 observer 需要分发或者 LiveData 接收到新的数值需要分发数据,此时第一次的分发还没有完成则被认为是无效的分发,需重新遍历分发最 “新鲜” 的数据。

private void dispatchingValue(@Nullable ObserverWrapper initiator) {
    //如果当前正在分发,则认为旧遍历分发的过程是无效的
    if (mDispatchingValue) {		
        mDispatchInvalidated = true;
        return;
    }
    mDispatchingValue = true;
    do {
        //重置为false,当前分发有效
        mDispatchInvalidated = false;
        if (initiator != null) {
            considerNotify(initiator);
            initiator = null;
        } else {
            for (Iterator<Map.Entry<Observer<T>, ObserverWrapper>> iterator =
                    mObservers.iteratorWithAdditions(); iterator.hasNext(); ) {
                //通知
                considerNotify(iterator.next().getValue());
                //分发无效,终止旧遍历分发
                if (mDispatchInvalidated) {    
                    break;
                }
            }
        }
    } while (mDispatchInvalidated);//当设置分发无效时,重新分发
    //简单举例:do while内的逻辑还在执行中,此时突然设置了新的数据,则do while内的逻辑终止,此时来到while(mDispatchInvalidated),由于mDispatchInvalidated=true,所以会再次执行do while内的逻辑
    mDispatchingValue = false;
}

private void considerNotify(ObserverWrapper observer) {
    //处于非激活状态,返回
    if (!observer.mActive) {
        return;
    }
    //获取最新的状态,如果是从 “激活状态” -> “非激活状态”,则重新更新为 “非激活状态”,返回
    if (!observer.shouldBeActive()) {	
        observer.activeStateChanged(false);
        return;
    }
    //已经接收过 LiveData 的最新数据,返回
    if (observer.mLastVersion >= mVersion) {
        return;
    }
    //设置为最新数据版本
    observer.mLastVersion = mVersion;
    //通知数据改变
    observer.mObserver.onChanged((T) mData);
}

上面讲述的逻辑你可能有疑惑 observer 不是一个单纯的观察者吗? 但是上面的逻辑却涉及是否激活 (mActive) 等信息。实际上,Observer 确实是一个单纯的观察者,只是 LiveData 在分发数据的时候当它与某个拥有生命周期特征的角色相关联了。

下面就是介绍 “Observer 作为一个数据接收的角色,是怎么关联某个拥有生命周期的角色,进而怎么影响它接收数据的”

Observer 如何关联具有生命周期特征的角色,怎么接收数据

上一章节,LiveData 分发的对象实际上的 ObserverWrapper 对象. 从类的字面意识就是 观察者的包装类。
先举个例子

假如安保人员(观察者)在线下看到一个人(被观察者)在偷东西,则基于此行为(事件触发)判断他是一个小偷,立刻抓拿送到公安局,这种场景下可以理解为每一个施行偷窃(触发事件)的人(被观察者),都会被安保人员(观察者)抓拿送审。但是商场的安保人员无法实时观察每个来到商场的人员,只能在监控室中看各路的监控情况,每个监控一般对应商场的某一条通道,当该监控器正常运行(激活)且监控视频中出现偷窃行为,安保人员就会立刻采取措施抓拿小偷。但是部分商场的通道由于监控器坏了(未激活),导致拿到这条通道内出现偷窃行为,则安保人员也无法知情,自然无法采取抓拿行为。

上述例子中,监控器存在运行状态,只有当监控器正常运行的时候,安保人员才有可能对监控下的偷窃行为有所感知。如果监控器坏了,则丢失知情权。所以所谓包装,实际上就是观察者通过关联某个角色,该角色拥有生命周期,不同生命周期都可以表现成 “激活状态” 和 “非激活状态”。上述例子 “激活状态” 对应监控器运行状态,“非激活状态” 对应监控器损坏状态。在 Android 中 Activity 也可以看成拥有生命周期的角色,onStart()或之后阶段则为 “激活状态”,onDestroy()之后阶段则为 “非激活状态”。只有当关联角色处于 “激活状态” 时观察者才能感知到被观察者的行为变化。

如何关联呢? 看下 ObserverWrapper 的实现 (只列出相关核心方法)

private abstract class ObserverWrapper {
    final Observer<? super T> mObserver;
    boolean mActive;
    int mLastVersion = START_VERSION;

    ObserverWrapper(Observer<? super T> observer) {
        mObserver = observer;
    }
    abstract boolean shouldBeActive();
    
    //激活状态改变
    void activeStateChanged(boolean newActive) {
    	if (newActive == mActive) {
        	return;
    	}
    	mActive = newActive;
    	//...
    }
}

接收一个 observer 对象。但是没有看到有关生命周期特征的角色信息,其实是在子类 LifecycleBoundObserver实现. LiveData#observe(LifecycleOwner owner,Observer<? super T> observer) 实现真正关联。

//LiveData.java
//具有生命周期的对象
class LifecycleBoundObserver extends ObserverWrapper implements GenericLifecycleObserver {
    @NonNull final LifecycleOwner mOwner;

    LifecycleBoundObserver(@NonNull LifecycleOwner owner, Observer<? super T> observer) {
        super(observer);
        mOwner = owner;
    }

	//只有在started或者之后的状态(不包含DESTROYED) 才算 “激活状态”
    @Override
    boolean shouldBeActive() {
        return mOwner.getLifecycle().getCurrentState().isAtLeast(STARTED);
    }
    
    //实现 GenericLifecycleObserver 接口,生命周期变化也要动态调整 mActive 值
    @override
    public void onStateChanged(LifecycleOwner source, Lifecycle.Event event) {
        //当状态为DESTROYED时,移除观察
        if (mOwner.getLifecycle().getCurrentState() == DESTROYED) {
            removeObserver(mObserver);
            return;
        }
        activeStateChanged(shouldBeActive());
    }
}
//LiveData.java
public void observe(@NonNull LifecycleOwner owner, @NonNull Observer<? super T> observer) {
    LifecycleBoundObserver wrapper = new LifecycleBoundObserver(owner, observer);
    owner.getLifecycle().addObserver(wrapper);
}

LiveData#observeForever(Observer<? super T> observer) 也提供了绑定观察者的方法,不需要关联任何生命周期特征的角色,则观察者随时都能获知被观察者的数据变化.

//LivaData.java
private class AlwaysActiveObserver extends ObserverWrapper {

    AlwaysActiveObserver(Observer<? super T> observer) {
        super(observer);
    }

    //默认一直处于激活状态
    @Override
    boolean shouldBeActive() {
        return true;
    }
}

//LivaData.java
public void observeForever(@NonNull Observer<? super T> observer) {
    AlwaysActiveObserver wrapper = new AlwaysActiveObserver(observer);
    //默认设置 mActive 为true
    wrapper.activeStateChanged(true);
}

上述两种场景可以看到 mActive 用于表示是否处于 “激活状态”,同时针对关联生命周期特征的 LifecycleBoundObserver,随着自己生命周期的变化,状态也会随着动态更改。

上一章可知,分发数据的逻辑最终落在 LiveData#considerNotify 方法

private void considerNotify(ObserverWrapper observer) {
    if (!observer.mActive) {
        return;
    }
    if (!observer.shouldBeActive()) {	//如果当前状态发生变化,则
        observer.activeStateChanged(false);
        return;
    }
    if (observer.mLastVersion >= mVersion) {
        return;
    }
    observer.mLastVersion = mVersion;
    observer.mObserver.onChanged((T) mData);
}
  1. 如果处于非激活状态,返回;
  2. 获取最新的状态,如果是从 “激活状态” -> “非激活状态”,则重新更新状态,返回;
  3. 如果处于激活状态,但是已经接收过 LiveData 的最新数据,则返回;
  4. 接收 LiveData 最新数据更新并更新 mLastVersion。

在 LifecycleBoundObserver 类中,其实现的 GenericLifecycleObserver 是一个用于监听 “拥有生命周期特征的角色” 的生命状态变化。 而 “拥有生命周期特征的角色” 到底是个什么东西,见下章节。

谁是拥有 “生命周期特征” 的角色

LifecycleBoundObserver 实现的 GenericLifecycleObserver 提供的 onStateChanged(LifecycleOwner source, Lifecycle.Event event) 方法中,参数1见名知义,LifecycleOwnerLifecycleOwner 是一个接口,返回 拥有 “生命周期特征” 的角色。

public interface LifecycleOwner {
    @NonNull
    Lifecycle getLifecycle();
}

Lifecycle 就是拥有 “生命周期特征” 的角色。

public abstract class Lifecycle {

    public abstract void addObserver(@NonNull LifecycleObserver observer);
    public abstract void removeObserver(@NonNull LifecycleObserver observer);
    public abstract State getCurrentState();

    public enum Event {
        ON_CREATE,
        ON_START,
        ON_RESUME,
        ON_PAUSE,
        ON_STOP,
        ON_DESTROY,
        ON_ANY
    }

    public enum State {

        DESTROYED,
        INITIALIZED,
        CREATED,
        STARTED,
        RESUMED;

        public boolean isAtLeast(@NonNull State state) {
            return compareTo(state) >= 0;
        }
    }
  • Lifecycle 是一个抽象类,addObserver/removeObserver 用于添加/移除对自身的监听,getCurrentState用于返回当前自身的生命状态。
  • Event 表示 Lifecycle 在某个时刻所发射的事件
  • State 表示 Lifecycle 当前所处的状态

下面是一张生命周期图对照状态图:

比如 LifecycleOwner 处于 STARTED 状态,LifecycleObserver 则会收到 ON_CREATE 和 ON_START 事件。LifecycleObserver 实际上是一个空方法的接口,其继承者是 GenericLifecycleObserver

LifecycleBoundObserver 作为 ObserverWrapper 的实例,完成了观察者对生命周期对象的关联。

  1. LifecycleBoundObserver.mOwner  即LifecycleOwner 通过getLifecycle()方法间接持有 Lifecycle 对象
  2. LifecycleBoundObserver 本身实现了 GenericLifecycleObserver,就是一个 LifecycleObserver 对象
  3. 通过调用 Lifecycle#addObserver / Lifecycle#removeObserver 实现关联
  4. 在关联期间,只要 Lifecycle 的状态有变化,就会通过 GenericLifecycleObserver#onStateChanged 回调,进而更新 ObserverWrapper.mActive.

至此,谁是拥有 “生命周期特征” 的角色的问题得到解答。同时,从 Lifecycle 的角度进一步阐述了 “Observer 如何关联具有生命周期特征的角色”

谁是观察者清楚了。

谁是被观察者也清楚了。

谁是有 “生命周期特征” 的角色也露出水面,观察者如何 “勾搭” 她的也一清二楚。

那么整条逻辑谁来盯着 有 “生命周期特征的” 角色 的生命周期变化的? 从代码的角度就是被 Lifecycle#addObserver 所添加的 LifecycleObserver 对象是何时调用 GenericLifecycleObserver r#onStateChanged 方法呢? 最后一章补上这个逻辑就完整了!

Activity/Fragment 是如何成为 LifecycleOwner?

标题实际上有些 “剧透”了。在 Android 体系中,Activity/Fragment 实际上都是 “生命周期特征” 的角色 的拥有者,就是他们持有 Lifecycle 对象。android.arch.lifecycle 包为 Lifecycle 提供了 LifecycleRegistry 的实现,旨在为了 Activity/Fragment 方便管理多个 LifecycleObserver 的监听。

ComponentActivity 作为 Activity 的子类,实现了 LifecycleOwner 接口.同时,也是 FragmentActivity 和 AppCompatActivity 的父类。

public class ComponentActivity extends Activity implements LifecycleOwner {

	private LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this);

	@Override
	public Lifecycle getLifecycle() {
   	 	return mLifecycleRegistry;
	}
}
public class FragmentActivity extends ComponentActivity{}
public class AppCompatActivity extends FragmentActivity{}

也就是说 Activity 实际上是委托 mLifecycleRegistry 完成有关生命周期的事务处理。也就是说,如果你在 activity 调用 LiveData#observe(this,observer)

public void observe(@NonNull LifecycleOwner owner, @NonNull Observer<T> observer) {
    LifecycleBoundObserver wrapper = new LifecycleBoundObserver(owner, observer);
    //绑定 LifecycleObserver
    owner.getLifecycle().addObserver(wrapper);
}

实际上就是调用 activity.mLifecycleRegistry#addObserver 进行绑定。先认识下 LifecycleRegistry 的核心代码逻辑。

public class LifecycleRegistry extends Lifecycle {
   private State mState;//当前状态
   private final WeakReference<LifecycleOwner> mLifecycleOwner;//外层 activity 弱引用
   private ArrayList<State> mParentStates = new ArrayList<>();
   private int mAddingObserverCounter = 0;   //是否正在添加 observer
   private boolean mHandlingEvent = false;   //是否正在处理 event 事件
   private boolean mNewEventOccurred = false; //是否有新的事件来临
	
	//默认使用弱引用绑定外层 activity,设置初始状态
	public LifecycleRegistry(@NonNull LifecycleOwner provider) {
        mLifecycleOwner = new WeakReference<>(provider);
        mState = INITIALIZED;
    }
    
    
   //内部类,用于每个 LifecycleObserver 关联状态 Lifecycle 的状态
   static class ObserverWithState {
        State mState;
        GenericLifecycleObserver mLifecycleObserver;

        ObserverWithState(LifecycleObserver observer, State initialState) {
        	//用于保证获取到 LifecycleObserver 的实例
            mLifecycleObserver = Lifecycling.getCallback(observer);              
            mState = initialState;
        }

		  //接受 event,然后计算 state 返回,实际上 state 都是通过 event 驱动计算的
        void dispatchEvent(LifecycleOwner owner, Event event) {
            State newState = getStateAfter(event);
            mState = min(mState, newState);
            mLifecycleObserver.onStateChanged(owner, event);
            mState = newState;
        }
    }
    
    //方法一
    public void addObserver(@NonNull LifecycleObserver observer) {
        //保存 observer,并设置它的初始状态为 DESTROYED 或者 INITIALIZED
        State initialState = mState == DESTROYED ? DESTROYED : INITIALIZED;
        ObserverWithState statefulObserver = new ObserverWithState(observer, initialState);
        
        //去重判断(不存在对应observer key的value时,保存到链表尾部并返回null;已存在时,返回已存在value)
        ObserverWithState previous = mObserverMap.putIfAbsent(observer, statefulObserver);
        if (previous != null) {
            return;
        }
        
        //lifecycleOwner 是否已经被回收
        LifecycleOwner lifecycleOwner = mLifecycleOwner.get();
        if (lifecycleOwner == null) {
            return;
        }

		 //确保 statefulObserver 的状态是正确的
        //当前是否处于 添加上一个 observer 的状态下(即上一个 observer 的添加还没走完过程)| 当前是否处于 event 事件中
        boolean isReentrance = mAddingObserverCounter != 0 || mHandlingEvent;
        //计算添加的 observer 的目标状态(当前处于 DESTROYED 或者 INITIALIZED)
        State targetState = calculateTargetState(observer);
        //设置为 正在添加 observer 的状态
        mAddingObserverCounter++;
        //如果 observer 的当前状态小于它的目标状态 并且 observer 处于 mObserverMap 中
        while ((statefulObserver.mState.compareTo(targetState) < 0
                && mObserverMap.contains(observer))) {
            //将当前 statefulObserver.mState 的状态保存在 mParentState 列表的的末尾
            pushParentState(statefulObserver.mState);
            //根据 statefulObserver 的状态,找到下一个事件,调度事件,进而触发 LifecycleBoundObserver 的 onStateChanged 方法,条件触发 activeStateChanged 方法
            statefulObserver.dispatchEvent(lifecycleOwner, upEvent(statefulObserver.mState));
            //弹出 mParentState 列表的的末尾
            popParentState();
            //重新计算目标状态
            targetState = calculateTargetState(observer);
        }

        //当前不处于添加观察者、调度事件中,同步 state 给 所有observerWithState 并实现状态回调
        if (!isReentrance) {
            sync();
        }
        //退出 添加 observer 的状态
        mAddingObserverCounter--;
    }
    
    //方法二,外部设置 event 的入口(在ReportFragment中的各个生命周期时调用,而 ReportFragment 在各个 Activity onCreate 方法时,创建实例并将 Activity 作为参数传给它;
ProcessLifecycleOwnerInitializer(extends ContentProvider) 初始化作为开端)
    public void handleLifecycleEvent(@NonNull Lifecycle.Event event) {
        State next = getStateAfter(event);
        moveToState(next);
    }

	//方法三
	//把 event 转化为 state并
    private void moveToState(State next) {
        if (mState == next) {
            return;
        }
        mState = next;
        if (mHandlingEvent || mAddingObserverCounter != 0) {
            mNewEventOccurred = true;
            // we will figure out what to do on upper level.
            return;
        }
        mHandlingEvent = true;
        sync();
        mHandlingEvent = false;
    }
    

    //方法四 同步 state 给 所有observerWithState 并实现状态回调
   private void sync() {
        LifecycleOwner lifecycleOwner = mLifecycleOwner.get();
        if (lifecycleOwner == null) {
            Log.w(LOG_TAG, "LifecycleOwner is garbage collected, you shouldn't try dispatch "
                    + "new events from it.");
            return;
        }
        while (!isSynced()) {
            mNewEventOccurred = false;
            //mState 越小,则生命周期越靠前(除了DESTROYED),可见 State 枚举类
            //已知链表从头到尾顺序为----最早添加到最晚添加,即新观察者在末尾
            //如果链表中第一个 observerWithState 的状态都小于 mState,则链表中所有 observerWithState 状态都小于 mState,需要往上更新到 mState (例如 INITIALIZED->RESUMED)
            if (mState.compareTo(mObserverMap.eldest().getValue().mState) < 0) {
                backwardPass(lifecycleOwner);
            }
            
            //如果链表中最后一个 observerWithState 的状态都大于 mState,则链表中所有 observerWithState 状态都大于 mState,需要往下更新到 mState (例如 RESUMED-> CREATED)
            Entry<LifecycleObserver, ObserverWithState> newest = mObserverMap.newest();
            if (!mNewEventOccurred && newest != null
                    && mState.compareTo(newest.getValue().mState) > 0) {
                forwardPass(lifecycleOwner);
            }
        }
        mNewEventOccurred = false;
    }
    
    //方法五
    private boolean isSynced() {
        if (mObserverMap.size() == 0) {
            return true;
        }
        State eldestObserverState = mObserverMap.eldest().getValue().mState;
        State newestObserverState = mObserverMap.newest().getValue().mState;
        return eldestObserverState == newestObserverState && mState == newestObserverState;
    }
}

上述类信息方法比较多,总结一下:

  • 方法一,用于添加监听者 LifecycleObserver ,比较好理解;
  • 方法二,给外部调用,通过接受 Event 来计算当前 State;
  • 方法三,真正设置 State,开始同步工作;
  • 方法四和方法五,主要用于内部的状态同步流程同时把信息同步给外部监听者 LifecycleObserver。

对于 handleLifecycleEvent 的调用,实际上我们自然能想到在 Activity/Fragment 的各个生命周期阶段回调方法中调用。但是我检索了所有 Activity/Fragment 的源码缺没有发现有调用该方法的痕迹。对于 Activity,唯一可利用的就是注册Application.ActivityLifecycleCallbacks Activity 生命周期回调了。

如果你也看到 RxPermission 的源码,那么接下来的操作你应该都很熟悉,傀儡化 “Fragment” !

android.arch.lifecycle 包有一个 Fragment 的实现类 ReportFragment ,用于帮助为 Activity/Fragment 分发 Event 事件的。如果 activity 持有 ReportFragment 对象,那么 ReportFragment 可以分发代表其 activity 生命周期的事件。那么我们只要重写 Fragment 的生命周期回调方法添加事件驱动也就可以解决 Activity 生命周期回调的问题。对于 Activity内持有的Fragment,我们可以通过 FragmentController 实例间接操作 FragmentManager 可获取生命周期变化时机。

实际上整套体系中非 AndroidX库中还存在 LifecycleRegistryOwner 这个类,旧版本 Activity/Fragment 都实现了这个类用于表示其内部都持有 LifecycleRegistry 对象。但是 AndroidX 已经完全废弃了,源码流程中我都删除了这部分信息,新版本的思路以我下面分析为主。

class LifecycleDispatcher {

    private static AtomicBoolean sInitialized = new AtomicBoolean(false);

    //静态方法,外部调用注册(ProcessLifecycleOwnerInitializer#onCreate())
    static void init(Context context) {
        if (sInitialized.getAndSet(true)) {
            return;
        }
        ((Application) context.getApplicationContext())
                .registerActivityLifecycleCallbacks(new DispatcherActivityCallback());
    }

    @SuppressWarnings("WeakerAccess")
    @VisibleForTesting
    static class DispatcherActivityCallback extends EmptyActivityLifecycleCallbacks {

        @Override
        public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
            ReportFragment.injectIfNeededIn(activity);
        }

        @Override
        public void onActivityStopped(Activity activity) {
        }

        @Override
        public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
        }
    }

    private LifecycleDispatcher() {
    }
}

 上述是在 onActivityCreated 调用 ReportFragment#injectIfNeededIn 注入 activity 对象。

//以下类中省略一些源码,只保留核心逻辑
public class ReportFragment extends Fragment {

    public static void injectIfNeededIn(Activity activity) {
        if (Build.VERSION.SDK_INT >= 29) {
            // On API 29+, we can register for the correct Lifecycle callbacks directly
            activity.registerActivityLifecycleCallbacks(
                    new LifecycleCallbacks());
        }
        // Prior to API 29 and to maintain compatibility with older versions of
        // ProcessLifecycleOwner (which may not be updated when lifecycle-runtime is updated and
        // need to support activities that don't extend from FragmentActivity from support lib),
        // use a framework fragment to get the correct timing of Lifecycle events
        android.app.FragmentManager manager = activity.getFragmentManager();
        if (manager.findFragmentByTag(REPORT_FRAGMENT_TAG) == null) {
            manager.beginTransaction().add(new ReportFragment(), REPORT_FRAGMENT_TAG).commit();
            // Hopefully, we are the first to make a transaction.
            manager.executePendingTransactions();
        }
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        dispatchCreate(mProcessListener);
        dispatch(Lifecycle.Event.ON_CREATE);
    }

    @Override
    public void onStart() {
        super.onStart();
        dispatchStart(mProcessListener);
        dispatch(Lifecycle.Event.ON_START);
    }

    @Override
    public void onResume() {
        super.onResume();
        dispatchResume(mProcessListener);
        dispatch(Lifecycle.Event.ON_RESUME);
    }

    @Override
    public void onPause() {
        super.onPause();
        dispatch(Lifecycle.Event.ON_PAUSE);
    }

    @Override
    public void onStop() {
        super.onStop();
        dispatch(Lifecycle.Event.ON_STOP);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        dispatch(Lifecycle.Event.ON_DESTROY);
        // just want to be sure that we won't leak reference to an activity
        mProcessListener = null;
    }

    private void dispatch(@NonNull Lifecycle.Event event) {
        if (Build.VERSION.SDK_INT < 29) {
            // Only dispatch events from ReportFragment on API levels prior
            // to API 29. On API 29+, this is handled by the ActivityLifecycleCallbacks
            // added in ReportFragment.injectIfNeededIn
            dispatch(getActivity(), event);
        }
    }

    static void dispatch(@NonNull Activity activity, @NonNull Lifecycle.Event event) {
        if (activity instanceof LifecycleRegistryOwner) {
            ((LifecycleRegistryOwner) activity).getLifecycle().handleLifecycleEvent(event);
            return;
        }

        if (activity instanceof LifecycleOwner) {
            Lifecycle lifecycle = ((LifecycleOwner) activity).getLifecycle();
            if (lifecycle instanceof LifecycleRegistry) {
                ((LifecycleRegistry) lifecycle).handleLifecycleEvent(event);
            }
        }
    }
}

ReportFragment 对象最终被添加到 activity 的 fragmentManager 中完成了处理 Activity 生命周期事件驱动的使命。但是对于 FragmentActivity 内持有的 Fragment,则需要 FragmentController 来处理 Fragment 的生命周期而存在的。

//类一
public class FragmentActivity extends ComponentActivity implements ...{

	//HostCallbacks 是 FragmentContainer 对象,实际上 fragment 可以被任何类所持有使用,只是我们常见的 host 就是 Activity 而已。FragmentContainer 中保存 host 的大量信息,比如 FragmentManager
	final FragmentController mFragments = FragmentController.createController(new HostCallbacks());
	
	 @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        mFragments.dispatchCreate();
    }
    
    @Override
    protected void onStart() {
        if (!mCreated) {
            mFragments.dispatchActivityCreated();
        }
        mFragments.dispatchStart();
    }
    
    @Override
    protected void onPostResume() {
        mFragments.dispatchResume();
    }
    
    @Override
    protected void onPause() {
        if (mHandler.hasMessages(MSG_RESUME_PENDING)) {
				mFragments.dispatchResume();
        }
        mFragments.dispatchPause();
    }
    
    @Override
    protected void onStop() {
        mFragments.dispatchStop();
    }
    
    @Override
    protected void onDestroy() {
        mFragments.dispatchDestroy();
    }

}

//类二
public class FragmentController {
	private final FragmentHostCallback<?> mHost;
	public void dispatchCreate() {
        mHost.mFragmentManager.dispatchCreate();
    }
    public void dispatchActivityCreated() {
        mHost.mFragmentManager.dispatchActivityCreated();
    }
    public void dispatchStart() {
        mHost.mFragmentManager.dispatchStart();
    }
    public void dispatchResume() {
        mHost.mFragmentManager.dispatchResume();
    }
    public void dispatchPause() {
        mHost.mFragmentManager.dispatchPause();
    }
    public void dispatchStop() {
        mHost.mFragmentManager.dispatchStop();
    }
    public void dispatchDestroyView() {   //目前并没有找到调用,不影响整体流程
        mHost.mFragmentManager.dispatchDestroyView();
    }
    public void dispatchDestroy() {
        mHost.mFragmentManager.dispatchDestroy();
    }
}

//类三 略部分代码,保留核心逻辑
public abstract class FragmentManager {

	//方法一
    public void dispatchCreate() {
        dispatchStateChange(Fragment.CREATED);
    }

	//方法二
    public void dispatchActivityCreated() {
        dispatchStateChange(Fragment.ACTIVITY_CREATED);
    }

	//方法三
    public void dispatchStart() {
        dispatchStateChange(Fragment.STARTED);
    }

	//方法四
    public void dispatchResume() {
        dispatchStateChange(Fragment.RESUMED);
    }
    
	//方法五
    public void dispatchPause() {
        dispatchStateChange(Fragment.STARTED);
    }

	//方法六
    public void dispatchStop() {
        dispatchStateChange(Fragment.ACTIVITY_CREATED);
    }

	//方法七
    public void dispatchDestroyView() {
        dispatchStateChange(Fragment.CREATED);
    }

	//方法八
    public void dispatchDestroy() {
        dispatchStateChange(Fragment.INITIALIZING);
    }
    
    //方法九
    private void dispatchStateChange(int nextState) {
	    try {
	        mExecutingActions = true;
	        moveToState(nextState, false); //间接调用
	    } finally {
	        mExecutingActions = false;
	    }
	    execPendingActions();
	}
	
	//方法十
	void moveToState(int newState, boolean always) {
    		//...
    		moveFragmentToExpectedState(f);
    		//...
	}
	
	//方法十一
    void moveFragmentToExpectedState(Fragment f) {
     		//...
     		moveToState(f, nextState, f.getNextTransition(), f.getNextTransitionStyle(), false);
     		//...
    }
	   
	//方法十二  
	void moveToState(Fragment f, int newState, int transit, int transitionStyle,boolean keepActive) {
	
        if (f.mState <= newState) {
            switch (f.mState) {
                case Fragment.INITIALIZING:
                    if (newState > Fragment.INITIALIZING) {

                        dispatchOnFragmentPreAttached(f, mHost.getContext(), false);
                        dispatchOnFragmentAttached(f, mHost.getContext(), false);

                        if (!f.mIsCreated) {
                            dispatchOnFragmentPreCreated(f, f.mSavedFragmentState, false);
                            f.performCreate(f.mSavedFragmentState);
                            dispatchOnFragmentCreated(f, f.mSavedFragmentState, false);
                        }
                    }
    
                case Fragment.CREATED:
                    if (newState > Fragment.CREATED) {
                        f.performActivityCreated(f.mSavedFragmentState);
                        dispatchOnFragmentActivityCreated(f, f.mSavedFragmentState, false);
                    }
                case Fragment.ACTIVITY_CREATED:
                    if (newState > Fragment.ACTIVITY_CREATED) {
                        f.performStart();
                        dispatchOnFragmentStarted(f, false);
                    }
                case Fragment.STARTED:
                    if (newState > Fragment.STARTED) {
                        f.performResume();
                        dispatchOnFragmentResumed(f, false);
                    }
            }
        } else if (f.mState > newState) {
            switch (f.mState) {
                case Fragment.RESUMED:
                    if (newState < Fragment.RESUMED) {
                        f.performPause();
                        dispatchOnFragmentPaused(f, false);
                    }
                case Fragment.STARTED:
                    if (newState < Fragment.STARTED) {
                        f.performStop();
                        dispatchOnFragmentStopped(f, false);
                    }
                case Fragment.ACTIVITY_CREATED:
                    if (newState < Fragment.ACTIVITY_CREATED) {
                        f.performDestroyView();
                        dispatchOnFragmentViewDestroyed(f, false);
                    }
                case Fragment.CREATED:
                    if (newState < Fragment.CREATED) {
                        if (f.getAnimatingAway() != null || f.getAnimator() != null) {
                            newState = Fragment.CREATED;
                        } else {
                            f.performDetach();
                            dispatchOnFragmentDetached(f, false);
                        }
                    }
            }
        }

        if (f.mState != newState) {
            f.mState = newState;
        }
   }

上述代码比较长,但是为了完整的逻辑链还是展示出来,最大程度去处了干扰的代码。代码从上到下,逻辑链也是从上到下串起来的。

  1. 类一 FragmentActivity 持有 FragmentController 对象用于管理 Fragment 的生命周期,在其自身的生命周期回调中同步调用 FragmentController 的通知方法
  2. 类二 FragmentController 通过 mHost 操作 FragmentManager 对象,让其代理执行生命周期调用
  3. 类三 FragmentManager 处理了所有 Fragment 的生命周期回调
    • 方法一至八,对应 Fragment 的八个回调
    • 方法九至十二,处理 Fragment 的状态
    • 如果 Fragment 存在父 Fragment,则 dispatchOnFragmentXXX 其父Fragment同步状态
    • Fragment #performXXX* 方法用于执行对应生命周期方法

到这里,还没有涉及 LifecycleRegistry#handleLifecycleEvent 方法调用。实际上 Fragment#performXXX 完成了这最后一步。

public class Fragment implements LifecycleOwner...{

    void performCreate(Bundle savedInstanceState) {
        onCreate(savedInstanceState);
        mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_CREATE);
    }

    void performActivityCreated(Bundle savedInstanceState) {
        onActivityCreated(savedInstanceState);
    }

    void performStart() {
        onStart();
        mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START);
    }

    void performResume() {
        onResume();
        mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_RESUME);
    }

    void performPause() {
        mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_PAUSE);
        onPause();
    }

    void performStop() {
        mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_STOP);
        onStop();
    }

    void performDestroyView() {
        onDestroyView();
    }
    
    void performDestroy() {
        mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_DESTROY);
        onDestroy();
 
    }
    
    void performDetach() {
        onDetach();
    }
}

也就是说,如果你在 fragment 调用 LiveData#observe(this,observer)

public void observe(@NonNull LifecycleOwner owner, @NonNull Observer<T> observer) {
    LifecycleBoundObserver wrapper = new LifecycleBoundObserver(owner, observer);
    //绑定 LifecycleObserver
    owner.getLifecycle().addObserver(wrapper);
}

实际上就是调用 fragment.mLifecycleRegistry#addObserver 进行绑定。最后在 fragment 各个生命周期回调用中处理 event,转化成 state,最终反馈到 LifecycleObserver 上!

扩展思考

  1. 在 Activity/Fragment 是如何成为 LifecycleOwner? 篇章出现了 LifecycleDispatcher 的这个类,有个 init 方法,我们的应用代码似乎没有调用过 ?

         利用 ContentProvider#onCreate 是一个非常优秀的方法
  2. 既然 Activity/Fragment 都能做生命周期状态感知,那么 Application 应该也是可以吧 ? 要怎么做呢 ?

         ProcessLifecycleOwner 就是做这个事儿!
  3. 既然 Fragment 已经能做到感知生命周期了,那为何还需要 ReportFragment ?

         Fragment 哪怕能感知,那什么时候能转成对应 activity 的生命周期呢? 还是需要重新在对应生命周期回调方法。

篇幅较长,可能花费较长时间阅读,但是相信会有很大的收获!

出处:yummyLau原文链接(http://yummylau.com/2020/04/06/源码解析——LiveData & Life生命周期完整体系详解)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值