Lifecycle的使用和源码解析

什么是Lifecycle

Lifecycle是生命周期感知型组件,它可以通过响应另一个组件(Activity或Fragment)的生命周期的变化来执行相应的操作,它有助于产出更有条理、更轻量级、更易于维护的代码。

Lifecycle是LiveData和ViewModel的基础,下面就先介绍为何使用Lifecycle及如何使用Lifecycle。

使用Lifecycle之前

假设我们有一个在屏幕上显示设备位置信息的Activity。常见的实现可能如下所示:

java 复制代码
    class MyLocationListener {

        public MyLocationListener(Context context, Callback callback) {
            // ...
        }

        void start() {
            // 开启定位服务
        }

        void stop() {
            // 停止定位服务
        }
    }

    class MyActivity extends AppCompatActivity {

        private MyLocationListener myLocationListener;

        @Override
        public void onCreate(...) {
            myLocationListener = new MyLocationListener(this, (location) -> {
                // 更新 UI
            });
        }

        @Override
        public void onStart() {
            super.onStart();
            myLocationListener.start();
        }

        @Override
        public void onStop() {
            super.onStop();
            myLocationListener.stop();
        }
    }

上面的示例看起来好像没问题,但是在实际的应用中,你需要在Activity对应的生命周期方法(如上例中的onStart()、onStop()方法)中写很多代码来管理UI和其他组件,这时候你就会发现这些代码很难维护。

此外,无法保证Activity在执行onStop()方法之前执行myLocationListener的start()方法,例如下面这种情况:

java 复制代码
class MyActivity extends AppCompatActivity {
    private MyLocationListener myLocationListener;

    public void onCreate(...) {
        myLocationListener = new MyLocationListener(this, location -> {
            // 更新 UI
        });
    }

    @Override
    public void onStart() {
        super.onStart();
        Util.checkUserStatus(result -> {
            //如果checkUserStatus()方法耗时较长,在activity执行完onStop()方法后才回调,
            //那么myLocationListener执行完start()方法后就没办法走stop()方法了,
            //又因为myLocationListener持有activity,会造成内存泄漏。
            if (result) {
                myLocationListener.start();
            }
        });
    }

    @Override
    public void onStop() {
        super.onStop();
        myLocationListener.stop();
    }
}

这样就导致myLocationListener不能按照预期执行stop()方法,又因为myLocationListener持有Activity的引用,从而导致内存泄漏。

上面出现了2个问题:

  1. Activity的生命周期方法中存在大量管理其他组件的代码,难以维护;
  2. 无法保证在退出Activity前执行相应的回收方法,容易导致内存泄露问题;

而Lifecycle可以帮助你解决这些问题。

Lifecycle的使用

引入依赖

  1. 非androidx项目引入:
arduino 复制代码
implementation "android.arch.lifecycle:extensions:1.1.1"
  1. androidx项目引入:
arduino 复制代码
implementation 'androidx.appcompat:appcompat:1.2.0'

因为appcompat依赖了androidx.fragment,而androidx.fragment下依赖了ViewModel和LiveData,LiveData内部又依赖了Lifecycle。

  1. 如果想要单独引入依赖,官方给出的依赖如下:
kotlin 复制代码
//app的build.gradle
dependencies {
    def lifecycle_version = "2.2.0"
    def arch_version = "2.1.0"

    // ViewModel
    implementation "androidx.lifecycle:lifecycle-viewmodel:$lifecycle_version"
    // LiveData
    implementation "androidx.lifecycle:lifecycle-livedata:$lifecycle_version"
    // 只有Lifecycles (不带 ViewModel or LiveData)
    implementation "androidx.lifecycle:lifecycle-runtime:$lifecycle_version"

    // Saved state module for ViewModel
    implementation "androidx.lifecycle:lifecycle-viewmodel-savedstate:$lifecycle_version"

    // lifecycle注解处理器
    annotationProcessor "androidx.lifecycle:lifecycle-compiler:$lifecycle_version"
    // 替换 - 如果使用Java8,就用这个替换上面的lifecycle-compiler
    implementation "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version"

        //以下按需引入
    // 可选 - 帮助实现Service的LifecycleOwner
    implementation "androidx.lifecycle:lifecycle-service:$lifecycle_version"
    // 可选 - ProcessLifecycleOwner给整个 app进程 提供一个lifecycle
    implementation "androidx.lifecycle:lifecycle-process:$lifecycle_version"
    // 可选 - ReactiveStreams support for LiveData
    implementation "androidx.lifecycle:lifecycle-reactivestreams:$lifecycle_version"
    // 可选 - Test helpers for LiveData
    testImplementation "androidx.arch.core:core-testing:$arch_version"
}

看着有很多,实际上如果只使用Lifecycle,只需要引入lifecycle-runtime即可,但通常都是和 ViewModel、 LiveData 配套使用的,所以lifecycle-viewmodel、lifecycle-livedata 一般也会引入。另外,lifecycle-process是给整个app进程提供一个lifecycle,后面也会提到。

基本使用

Lifecycle的使用方法很简单,主要分为2步:

  1. 生命周期拥有者使用getLifecycle()获取Lifecycle实例,然后调用addObserver()添加观察者;
  2. 观察者实现LifecycleObserver,方法上使用@OnLifecycleEvent注解关注对应的生命周期,生命周期触发时就会执行相应的方法;

代码如下:

java 复制代码
class LifecycleTestActivity : AppCompatActivity() {

    private val TAG = LifecycleTestActivity::class.java.simpleName

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        lifecycle.addObserver(MyObserver())
    }

    override fun onResume() {
        super.onResume()
        Log.i(TAG, "onResume: ")
    }

    override fun onPause() {
        super.onPause()
        Log.i(TAG, "onPause: ")
    }
}

class MyObserver : LifecycleObserver {

    private val TAG = "LifeCycleTest_MyObserver"

    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    fun connect() = Log.d(TAG,"connect run ...")

    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE) 
    fun disconnect() = Log.d(TAG,"disconnect run ...")
}

运行后打印如下:

arduino 复制代码
LifecycleTestActivity   com.example.test   I  onResume: 
LifeCycleTest_MyObserver com.example.test  D  connect run ...
LifeCycleTest_MyObserver com.example.test  D  disconnect run ...
LifecycleTestActivity   com.example.test   I  onPause: 

这里看到connect run ...在onResume:之前打印,而disconnect run ...在onPause:之后打印,这是为什么呢?这个问题我们留到后面分析源码的时候再来解释。

自定义LifecycleOwner

直接在Activity中使用getLifecycle()就能获取到Lifecycle实例,getLifecycle()方法来自接口LifecycleOwner:

java 复制代码
public interface LifecycleOwner {
    @NonNull
    Lifecycle getLifecycle();
}

如果一个类实现了LifecycleOwner就表示这个类具有生命周期,你也可以自定义类实现LifecycleOwner接口。

support library 26.1.0及以上的Fragment和Activity已实现LifecycleOwner接口,所以我们在Activity中可以直接使用getLifecycle()方法。

如果你想要自己定义一个类实现LifecycleOwner接口,你可以使用LifecycleRegistry,它是Lifecycle的实现类,但你需要将事件转发到LifecycleRegistry:

java 复制代码
public class MyActivity extends Activity implements LifecycleOwner {

    private LifecycleRegistry lifecycleRegistry;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        lifecycleRegistry = new LifecycleRegistry(this);
        lifecycleRegistry.markState(Lifecycle.State.CREATED);
    }
    
    @Override
    public void onStart() {
        super.onStart();
        lifecycleRegistry.markState(Lifecycle.State.STARTED);
    }
    
    @NonNull
    @Override
    public Lifecycle getLifecycle() {
        return lifecycleRegistry;
    }
}

MyActivity实现了LifecycleOwner接口,getLifecycle()返回lifecycleRegistry实例。lifecycleRegistry实例是在onCreate()方法中创建的,并且在各个生命周期内调用markState()方法完成生命周期事件的传递。这就完成了LifecycleOwner的自定义,也即MyActivity变成了LifecycleOwner,然后就可以和实现了LifecycleObserver接口的类配合使用了。

补充一点,观察者的方法可以接受一个参数LifecycleOwner,就可以用来获取当前状态、或者继续添加观察者。 若注解的是ON_ANY还可以接收Event,用于区分是哪个事件。如下:

java 复制代码
class TestObserver implements LifecycleObserver {

    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
    void onCreated(LifecycleOwner owner) {
        //owner.getLifecycle().addObserver(anotherObserver);
        //owner.getLifecycle().getCurrentState();
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_ANY)
    void onAny(LifecycleOwner owner, Lifecycle.Event event) {
        //event.name()
    }

}

MVP架构中使用Lifecycle

在MVP架构中可以把presenter作为观察者:

java 复制代码
public class LifecycleTestActivity extends AppCompatActivity implements IView {
    private String TAG = "Lifecycle_Test";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_lifecycle_test);
        //Lifecycle 生命周期
        //getLifecycle().addObserver(new MyObserver());

        //MVP中使用Lifecycle
        getLifecycle().addObserver(new MyPresenter(this));
        Log.i(TAG, "onCreate: ");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.i(TAG, "onResume: ");
    }
    @Override
    protected void onPause() {
        super.onPause();
        Log.i(TAG, "onPause: ");
    }

    @Override
    public void showView() {}
    @Override
    public void hideView() {}
}

//Presenter
class MyPresenter implements LifecycleObserver {
    private static final String TAG = "Lifecycle_Test";
    private final IView mView;

    public MyPresenter(IView view) {mView = view;}

    @OnLifecycleEvent(value = Lifecycle.Event.ON_START)
    private void getDataOnStart(LifecycleOwner owner){
        Log.i(TAG, "getDataOnStart: ");

        Util.checkUserStatus(result -> {
                //checkUserStatus是耗时操作,回调后检查当前生命周期状态
                if (owner.getLifecycle().getCurrentState().isAtLeast(STARTED)) {
                	start();
                    mView.showView();
                }
            });
    }
    @OnLifecycleEvent(value = Lifecycle.Event.ON_STOP)
    private void hideDataOnStop(){
        Log.i(TAG, "hideDataOnStop: ");
        stop();
        mView.hideView();
    }
}

//IView
interface IView {
    void showView();
    void hideView();
}

这里是让Presenter实现LifecycleObserver接口,同样在方法上注解要触发的生命周期,最后在Activity中作为观察者添加到Lifecycle中。

这样做好处是啥呢? 当Activity生命周期发生变化时,MyPresenter就可以感知并执行方法,不需要在MainActivity的多个生命周期方法中调用MyPresenter的方法了。

Presenter类自动感知生命周期,如果需要在其他的Activity或Fragment也使用这个Presenter,只需添加其为观察者即可。让Presenter存储自己的逻辑,减轻Activity或Fragment中代码,更易于管理;

另外,注意到 getDataOnStart()中耗时校验回调后,对当前生命周期状态进行了检查:至少处于STARTED状态才会继续执行start()方法,也就是保证了Activity停止后不会走start()方法;

这样,使用LifeCycle后,文章前面遇到的2个问题得到了解决。

Application生命周期 ProcessLifecycleOwner

之前对App进入前后台的判断是通过registerActivityLifecycleCallbacks(callback)方法,然后在callback中利用一个全局变量做计数,在onActivityStarted()中计数加1,在onActivityStopped方法中计数减1,从而判断前后台切换。

而使用ProcessLifecycleOwner可以直接获取应用前后台切换状态。(记得先引入lifecycle-process依赖)

使用方式和Activity中类似,只不过要使用ProcessLifecycleOwner.get()获取ProcessLifecycleOwner,代码如下:

java 复制代码
public class MyApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();

	    //注册App生命周期观察者
        ProcessLifecycleOwner.get().getLifecycle().addObserver(new ApplicationLifecycleObserver());
    }
    
    /**
     * Application生命周期观察,提供整个应用进程的生命周期
     *
     * Lifecycle.Event.ON_CREATE只会分发一次,Lifecycle.Event.ON_DESTROY不会被分发。
     *
     * 第一个Activity进入时,ProcessLifecycleOwner将分派Lifecycle.Event.ON_START, Lifecycle.Event.ON_RESUME。
     * 而Lifecycle.Event.ON_PAUSE, Lifecycle.Event.ON_STOP,将在最后一个Activit退出后后延迟分发。如果由于
     * 配置更改而销毁并重新创建活动,则此延迟足以保证ProcessLifecycleOwner不会发送任何事件。
     *
     * 作用:监听应用程序进入前台或后台
     */
    private static class ApplicationLifecycleObserver implements LifecycleObserver {
        @OnLifecycleEvent(Lifecycle.Event.ON_START)
        private void onAppForeground() {
            Log.w(TAG, "ApplicationObserver: app moved to foreground");
        }

        @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
        private void onAppBackground() {
            Log.w(TAG, "ApplicationObserver: app moved to background");
        }
    }
}

看到确实很简单,和前面Activity的Lifecycle用法几乎一样,而我们使用ProcessLifecycleOwner就显得很优雅了,生命周期分发逻辑已在注释里说明。

源码分析

本文源码基于androidx.lifecycle:lifecycle-runtime:2.3.1

Lifecycle持有另一个组件(比如Activity或Fragment)的生命周期状态有关的信息,主要使用两个枚举类型来追踪与其关联的组件的生命周期状态,Lifecycle代码如下:

java 复制代码
public abstract class Lifecycle {

    @MainThread
    public abstract void addObserver(@NonNull LifecycleObserver observer);

    @MainThread
    public abstract void removeObserver(@NonNull LifecycleObserver observer);

    @MainThread
    @NonNull
    public abstract State getCurrentState();

    //对应LifecycleOwner的Event
    public enum Event {
        ON_CREATE,
        ON_START,
        ON_RESUME,
        ON_PAUSE,
        ON_STOP,
        ON_DESTROY,
        ON_ANY;
    }

    //对应LifecycleOwner的状态
    public enum State {
        //此事件后,Lifecycle将不再分发事件。对于Activity来说,
        //在Activity的onDestroy()方法调用之前到达这个状态。
        DESTROYED,

        //对于Activity来说,这是Activity已经构建但是onCreate()方法调用前的状态。
        INITIALIZED,

        //对于Activity来说,这是Activity调用onCreate()后,调用onStop()前的状态。
        CREATED,

        //对于Activity来说,这是Activity调用onStart()后,调用onPause()前的状态。
        STARTED,

        //对于Activity来说,是调用Activity的onResume()方法后到达的状态。
        RESUMED;

        //比较当前状态是否>=传入的状态
        public boolean isAtLeast(@NonNull State state) {
            return compareTo(state) >= 0;
        }
    }
}

这两个枚举类型分别是:

  • Event:分发的生命周期事件,对应于Activity或Fragment中的生命周期方法。
  • State:LifecycleOwner当前的状态。

关于Activity中State与Event的关系,官网有张图很清晰: 其中State是图中的一个个节点,Event是这些节点之间的过渡。

被观察者流程

前面提到Activity实现了LifecycleOwner,所以才能直接使用getLifecycle()方法,具体是在androidx.activity.ComponentActivity中,我们来看看ComponentActivity中是怎么处理的:

java 复制代码
public class ComponentActivity extends androidx.core.app.ComponentActivity implements LifecycleOwner{

    private final LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this);

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ...
        //使用ReportFragment监听Activity的生命周期状态
        ReportFragment.injectIfNeededIn(this); 
        ...
    }
    
    @CallSuper
    @Override
    protected void onSaveInstanceState(@NonNull Bundle outState) {
        mLifecycleRegistry.markState(Lifecycle.State.CREATED);
        super.onSaveInstanceState(outState);
    }

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

乍一看,并没有在ComponentActivity的生命周期方法中找到对应的代码,实际监听生命周期的处理在 ReportFragment的injectIfNeededIn()方法里中:

java 复制代码
public class ReportFragment extends android.app.Fragment {

    public static void injectIfNeededIn(Activity activity) {
        if (Build.VERSION.SDK_INT >= 29) {
            //API 29+,直接使用LifecycleCallbacks监听生命周期
            LifecycleCallbacks.registerIn(activity);
        }

        //API 29之前,添加ReportFragment监听生命周期
        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);
        dispatch(Lifecycle.Event.ON_CREATE);
    }

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

    @Override
    public void onResume() {
        super.onResume();
        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);
    }

    private void dispatch(@NonNull Lifecycle.Event event) {
        if (Build.VERSION.SDK_INT < 29) {
            // API 29之前才需要这样分发
            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);
            }
        }
    }

    //在API 29及以上,使用的生命周期回调
    static class LifecycleCallbacks implements Application.ActivityLifecycleCallbacks {

        static void registerIn(Activity activity) {
            activity.registerActivityLifecycleCallbacks(new LifecycleCallbacks());
        }

        @Override
        public void onActivityPostCreated(@NonNull Activity activity,
                @Nullable Bundle savedInstanceState) {
            dispatch(activity, Lifecycle.Event.ON_CREATE);
        }

        @Override
        public void onActivityPostStarted(@NonNull Activity activity) {
            dispatch(activity, Lifecycle.Event.ON_START);
        }

        @Override
        public void onActivityPostResumed(@NonNull Activity activity) {
            dispatch(activity, Lifecycle.Event.ON_RESUME);
        }

        @Override
        public void onActivityPrePaused(@NonNull Activity activity) {
            dispatch(activity, Lifecycle.Event.ON_PAUSE);
        }

        @Override
        public void onActivityPreStopped(@NonNull Activity activity) {
            dispatch(activity, Lifecycle.Event.ON_STOP);
        }

        @Override
        public void onActivityPreDestroyed(@NonNull Activity activity) {
            dispatch(activity, Lifecycle.Event.ON_DESTROY);
        }
    }
}

在API 29及以上,使用LifecycleCallbacks来监听Activity的生命周期,由于dispatch(activity, Lifecycle.Event.ON_RESUME)在onActivityPostResumed()方法中调用,而dispatch(activity, Lifecycle.Event.ON_PAUSE)onActivityPrePaused()方法中调用,这就是前面的打印为什么一个在onResume()之后,一个在onPause()之前的原因。

一般我们会通过重写onCreateView()方法来给Fragment添加布局,注意这里ReportFragment中没有重写这个方法,所以ReportFragment是没有布局的透明Fragment。ReportFragment的作用就是获取生命周期而已,因为fragment生命周期是依附于Activity的。好处就是把这部分逻辑抽离出来,实现activity的无侵入。如果你对Glide比较熟,就会知道它也是使用透明Fragment获取生命周期的。

上面的代码中无论是使用LifecycleCallbacks还是使用ReportFragment最后都会在对应的生命周期方法中执行对应的dispatch(@NonNull Activity activity, @NonNull Lifecycle.Event event)方法,最后使用LifecycleRegistry的handleLifecycleEvent(event)方法来对对应的事件进行处理。这样就把生命周期事件的处理转移到了LifecycleRegistry中:

java 复制代码
public class LifecycleRegistry extends Lifecycle {

    //LifecycleObserver当前状态
    private State mState;
    
    //LifecycleOwner的弱引用
    private final WeakReference<LifecycleOwner> mLifecycleOwner;

    public LifecycleRegistry(@NonNull LifecycleOwner provider) {
        this(provider, true);
    }

    private LifecycleRegistry(@NonNull LifecycleOwner provider, boolean enforceMainThread) {
        mLifecycleOwner = new WeakReference<>(provider);
        //默认初始化为INITIALIZED
        mState = INITIALIZED;
        mEnforceMainThread = enforceMainThread;
    }

    public void handleLifecycleEvent(@NonNull Lifecycle.Event event) {
        State next = getStateAfter(event);//获取event发生之后的将要处于的状态
        moveToState(next);//移动到这个状态
    }

    private void moveToState(State next) {
        if (mState == next) {
            return;
        }
        //更新状态
        mState = next;
        //正在sync()或正在addObserver()
        if (mHandlingEvent || mAddingObserverCounter != 0) {
            mNewEventOccurred = true;
            // we will figure out what to do on upper level.
            return;
        }
        mHandlingEvent = true;
        sync();
        mHandlingEvent = false;
    }

    //对应于官网那张图
    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);
    }

}

在moveToState()方法中将当前状态mState与下一个状态next比较,如果相等,直接return;如果不相等,进行sync()同步:

java 复制代码
public class LifecycleRegistry extends Lifecycle {

    //存储observers,遍历时可以删除或添加
    //后添加的observer的state<=先添加的observer的state
    private FastSafeIterableMap<LifecycleObserver, ObserverWithState> mObserverMap  
        = new FastSafeIterableMap<>();
         

    // happens only on the top of stack (never in reentrance),
    // so it doesn't have to take in account parents
    private void sync() {
        LifecycleOwner lifecycleOwner = mLifecycleOwner.get();
        //LifecycleOwner已经被回收了
        if (lifecycleOwner == null) {
            throw new IllegalStateException("LifecycleOwner of this LifecycleRegistry is already"
                    + "garbage collected. It is too late to change lifecycle state.");
        }
        
        while (!isSynced()) { //isSynced()表示所有观察者都同步完了
            mNewEventOccurred = false;
            
            //mObserverMap中存储的是观察者,状态按照从大到小排列,mState比最小的还小
            if (mState.compareTo(mObserverMap.eldest().getValue().mState) < 0) {
                backwardPass(lifecycleOwner);
            }
            Entry<LifecycleObserver, ObserverWithState> newest = mObserverMap.newest();
            //mState比最大的还大
            if (!mNewEventOccurred && newest != null
                    && mState.compareTo(newest.getValue().mState) > 0) {
                forwardPass(lifecycleOwner);
            }
        }
        mNewEventOccurred = false;
    }


    private boolean isSynced() {
        if (mObserverMap.size() == 0) {
            return true;
        }
        //mObserverMap中最早添加的观察者的状态
        State eldestObserverState = mObserverMap.eldest().getValue().mState;
        //mObserverMap中最新添加的观察者的状态
        State newestObserverState = mObserverMap.newest().getValue().mState;
        return eldestObserverState == newestObserverState && mState == newestObserverState;
    }

}

这里出现了mObserverMap,mObserverMap是FastSafeIterableMap类型的,其实是把数据存储在其内部的成员mHashMap中,代码如下:

typescript 复制代码
//简陋版的LinkedHashMap,支持遍历时的元素修改,比SafeIterableMap占用的内存多,非线程安全
public class FastSafeIterableMap<K, V> extends SafeIterableMap<K, V> {

    private HashMap<K, Entry<K, V>> mHashMap = new HashMap<>();

    @Override
    protected Entry<K, V> get(K k) {
        return mHashMap.get(k);
    }

    @Override
    public V putIfAbsent(@NonNull K key, @NonNull V v) {
        //从mHashMap中获取key对应的current(current类型是Entry<K,V>),
        //如果存在,返回current.mValue;
        Entry<K, V> current = get(key);
        if (current != null) {
            return current.mValue;
        }
        //如果不存在,存入mHashMap
        mHashMap.put(key, put(key, v));
        return null;
    }

    @Override
    public V remove(@NonNull K key) {
        V removed = super.remove(key);
        mHashMap.remove(key);
        return removed;
    }

    
    public boolean contains(K key) {
        return mHashMap.containsKey(key);
    }

    //获取mHashMap中k对应的节点在链表中的上一个节点
    public Map.Entry<K, V> ceil(K k) {
        if (contains(k)) {
            return mHashMap.get(k).mPrevious;
        }
        return null;
    }
}

FastSafeIterableMap的eldest()、newest()方法来自父类SafeIterableMap,下面来看看SafeIterableMap:

typescript 复制代码
//看起来是map,实际是LinkedList,支持遍历时修改元素,非线程安全
public class SafeIterableMap<K, V> implements Iterable<Map.Entry<K, V>> {

    //最早添加的entry
    Entry<K, V> mStart;
    //最新添加的entry
    private Entry<K, V> mEnd;
    
    private int mSize = 0;

    //返回最早添加的entry或null
    public Map.Entry<K, V> eldest() {
        return mStart;
    }

    //返回最新添加的entry或null
    public Map.Entry<K, V> newest() {
        return mEnd;
    }

    static class Entry<K, V> implements Map.Entry<K, V> {
        @NonNull
        final K mKey;
        @NonNull
        final V mValue;
        //下一个节点
        Entry<K, V> mNext;
        //上一个节点
        Entry<K, V> mPrevious;

    }
}

分析发现SafeIterableMap实际上是一个Entry<K, V>组成的双链表,FastSafeIterableMap是对SafeIterableMap的进一步封装,在Entry<K, V>的基础上添加了K,存储在HashMap<K, Entry<K, V>>中,这样方便快速通过key获取value,就不需要通过链表一个个遍历了。

mObserverMap是用来存储观察者的,mObserverMap添加观察者的地方就在getLifecycle().addObserver()中,代码如下:

java 复制代码
public class LifecycleRegistry extends Lifecycle {

 	 @Override
    public void addObserver(@NonNull LifecycleObserver observer) {
        //检查是否是主线程
        enforceMainThreadIfNeeded("addObserver");
        //初始状态
        State initialState = mState == DESTROYED ? DESTROYED : INITIALIZED;
        //将observer与initialState一起封装到ObserverWithState中,ObserverWithState是一个内部类
        ObserverWithState statefulObserver = new ObserverWithState(observer, initialState);
        //observer作为key,ObserverWithState作为value,存到mObserverMap
        ObserverWithState previous = mObserverMap.putIfAbsent(observer, statefulObserver);

        if (previous != null) {
            return;//已经添加过,直接返回
        }
        LifecycleOwner lifecycleOwner = mLifecycleOwner.get();
        if (lifecycleOwner == null) {
            // it is null we should be destroyed. Fallback quickly
            // lifecycleOwner被回收了,直接返回
            return;
        }

	      //isReentrance为true表示正在sync()或正在addObserver()
        boolean isReentrance = mAddingObserverCounter != 0 || mHandlingEvent;
        //获取目标状态
        State targetState = calculateTargetState(observer);
        mAddingObserverCounter++;
        //关注1,这里后面再分析
        while ((statefulObserver.mState.compareTo(targetState) < 0
                && mObserverMap.contains(observer))) {
            pushParentState(statefulObserver.mState);
            statefulObserver.dispatchEvent(lifecycleOwner, upEvent(statefulObserver.mState));
            popParentState();
            // mState / subling may have been changed recalculate
            targetState = calculateTargetState(observer);
        }

        if (!isReentrance) {
            // we do sync only on the top level.
            sync();
        }
        mAddingObserverCounter--;
    }

	static class ObserverWithState {
        State mState;
        LifecycleEventObserver mLifecycleObserver;

	      //构造函数
        ObserverWithState(LifecycleObserver observer, State initialState) {
            //初始化mLifecycleObserver
            mLifecycleObserver = Lifecycling.lifecycleEventObserver(observer);
            mState = initialState;
        }

        void dispatchEvent(LifecycleOwner owner, Event event) {
            State newState = getStateAfter(event);
            mState = min(mState, newState);  //mState的作用是:新的事件触发后遍历通知所有观察者时,判断是否已经通知这个观察者了,即防止重复通知。
            mLifecycleObserver.onStateChanged(owner, event);
            mState = newState;
        }
    }
}

用observer创建带状态的观察者ObserverWithState,observer作为key,ObserverWithState作为value,存入mObserverMap。

关注1我们后面再详细分析,这里的目的就是通过分发Event把当前添加的观察者的State一步一步同步到最新状态targetState。这就导致,比如你在Activity的onResume()方法中通过addObserver()添加观察者,但是onResume()之前的事件也会一一分发给观察者,即粘性。

回到最前面的sync()方法,mObserverMap.eldest().getValue()返回的是最早添加的到mObserverMap中的带状态的观察者ObserverWithState,mObserverMap.eldest().getValue().mState就是最早添加到mObserverMap中的观察者的状态。

这里为什么要使用while循环?

因为如果LifecycleOwner的当前状态为RESUMED,mObserverMap中观察者的状态为INITIALIZED,观察者的状态会从INITIALIZED->CREATED->STARTED->RESUMED一步一步转变,需要多次状态同步。

进入循环的条件是!isSynced(),若最早和最新添加的观察者的状态一致,且都是当前状态mState,说明已经同步完了。

没有同步完就进入循环体:

  • mState比最早添加的观察者状态小,走backwardPass()方法,从新到老分发,循环使用downEvent()和observer.dispatchEvent(),连续分发事件;
  • mState比最新添加的观察者状态大,走forwardPass()方法,从老到新分发,循环使用upEvent()和observer.dispatchEvent(),连续分发事件。
java 复制代码
public class LifecycleRegistry extends Lifecycle {

    private void forwardPass(LifecycleOwner lifecycleOwner) {
        //正序遍历链表,从老到新
        Iterator<Entry<LifecycleObserver, ObserverWithState>> ascendingIterator =
                mObserverMap.iteratorWithAdditions();
        while (ascendingIterator.hasNext() && !mNewEventOccurred) {
            Entry<LifecycleObserver, ObserverWithState> entry = ascendingIterator.next();
            ObserverWithState observer = entry.getValue();
            while ((observer.mState.compareTo(mState) < 0 && !mNewEventOccurred
                    && mObserverMap.contains(entry.getKey()))) {
                pushParentState(observer.mState);
                //观察者分发事件
                observer.dispatchEvent(lifecycleOwner, upEvent(observer.mState));
                popParentState();
            }
        }
    }

    private void backwardPass(LifecycleOwner lifecycleOwner) {
        //倒序遍历链表,从新到老
        Iterator<Entry<LifecycleObserver, ObserverWithState>> descendingIterator =
                mObserverMap.descendingIterator();
        while (descendingIterator.hasNext() && !mNewEventOccurred) {
            Entry<LifecycleObserver, ObserverWithState> entry = descendingIterator.next();
            ObserverWithState observer = entry.getValue();
            while ((observer.mState.compareTo(mState) > 0 && !mNewEventOccurred
                    && mObserverMap.contains(entry.getKey()))) {
                Event event = downEvent(observer.mState);
                pushParentState(getStateAfter(event));
                //观察者分发事件
                observer.dispatchEvent(lifecycleOwner, event);
                popParentState();
            }
        }
    }

    //回退
    private static Event downEvent(State state) {
        switch (state) {
            case INITIALIZED:
                throw new IllegalArgumentException();
            case CREATED:
                return ON_DESTROY;
            case STARTED:
                return ON_STOP;
            case RESUMED:
                return ON_PAUSE;
            case DESTROYED:
                throw new IllegalArgumentException();
        }
        throw new IllegalArgumentException("Unexpected state value " + state);
    }

    //前进
    private static Event upEvent(State state) {
        switch (state) {
            case INITIALIZED:
            case DESTROYED:
                return ON_CREATE;
            case CREATED:
                return ON_START;
            case STARTED:
                return ON_RESUME;
            case RESUMED:
                throw new IllegalArgumentException();
        }
        throw new IllegalArgumentException("Unexpected state value " + state);
    }
}

有没有发现上面代码12-15行与前面关注1处while循环里面的代码基本一致,也是同样的进行事件分发、状态同步。

observer.dispatchEvent()最终還是执行ObserverWithState的dispatchEvent()方法:

java 复制代码
static class ObserverWithState {
    State mState;
    LifecycleEventObserver mLifecycleObserver;

    //构造函数
    ObserverWithState(LifecycleObserver observer, State initialState) {
        //初始化mLifecycleObserver
        mLifecycleObserver = Lifecycling.lifecycleEventObserver(observer);
        mState = initialState;
    }

    void dispatchEvent(LifecycleOwner owner, Event event) {
        State newState = getStateAfter(event);
        //mState的作用是:新的事件触发后遍历通知所有观察者时,
        //判断是否已经通知这个观察者了,即防止重复通知。
        mState = min(mState, newState);  
        mLifecycleObserver.onStateChanged(owner, event);
        mState = newState;
    }
}

ObserverWithState的dispatchEvent()方法又调用了mLifecycleObserver的onStateChanged()方法,在ObserverWithState的构造方法中通过Lifecycling.lifecycleEventObserver(observer)初始化了mLifecycleObserver:

java 复制代码
public class Lifecycling {

    @NonNull
    static LifecycleEventObserver lifecycleEventObserver(Object object) {
        ...
        return new ReflectiveGenericLifecycleObserver(object);
    }
}

其中,ReflectiveGenericLifecycleObserver代码如下:

java 复制代码
class ReflectiveGenericLifecycleObserver implements LifecycleEventObserver {
    private final Object mWrapped;
    private final CallbackInfo mInfo;

    ReflectiveGenericLifecycleObserver(Object wrapped) {
        //mWrapped即为LifecycleObserver
        mWrapped = wrapped;
        //mInfo为LifecycleObserver对应的CallbackInfo
        mInfo = ClassesInfoCache.sInstance.getInfo(mWrapped.getClass());
    }

    @Override
    public void onStateChanged(LifecycleOwner source, Event event) {
        mInfo.invokeCallbacks(source, event, mWrapped);
    }
}

mLifecycleObserver的onStateChanged()方法又会调用mInfo.invokeCallbacks(source, event, mWrapped),其中mWrapped是我们添加的LifecycleObserver,而mInfo来自ClassesInfoCache:

ini 复制代码
final class ClassesInfoCache {
    //单例
    static ClassesInfoCache sInstance = new ClassesInfoCache();
    
    //使用mCallbackMap缓存观察者类对应的CallbackInfo
    private final Map<Class<?>, CallbackInfo> mCallbackMap = new HashMap<>();

    CallbackInfo getInfo(Class<?> klass) {
        CallbackInfo existing = mCallbackMap.get(klass);
        //如果存在,直接返回
        if (existing != null) {
            return existing;
        }
        //如果不存在,创建
        existing = createInfo(klass, null);
        return existing;
    }

    private CallbackInfo createInfo(Class<?> klass, @Nullable Method[] declaredMethods) {
        Class<?> superclass = klass.getSuperclass();
        //方法对应的Lifecycle.Event
        Map<MethodReference, Lifecycle.Event> handlerToEvent = new HashMap<>();
        if (superclass != null) {
            CallbackInfo superInfo = getInfo(superclass);
            if (superInfo != null) {
                handlerToEvent.putAll(superInfo.mHandlerToEvent);
            }
        }

        Class<?>[] interfaces = klass.getInterfaces();
        for (Class<?> intrfc : interfaces) {
            for (Map.Entry<MethodReference, Lifecycle.Event> entry : getInfo(
                    intrfc).mHandlerToEvent.entrySet()) {
                verifyAndPutHandler(handlerToEvent, entry.getKey(), entry.getValue(), klass);
            }
        }

        Method[] methods = declaredMethods != null ? declaredMethods : getDeclaredMethods(klass);
        boolean hasLifecycleMethods = false;
        //遍历实现了mLifecycleObserver接口的类中的方法
        for (Method method : methods) {
            //获取有@OnLifecycleEvent注解的方法
            OnLifecycleEvent annotation = method.getAnnotation(OnLifecycleEvent.class);
            if (annotation == null) {
                continue;
            }
            hasLifecycleMethods = true;
            Class<?>[] params = method.getParameterTypes();//获取方法参数
            int callType = CALL_TYPE_NO_ARG;
            //如果有参数
            if (params.length > 0) {
                callType = CALL_TYPE_PROVIDER;
                //第1个参数必须是LifecycleOwner
                if (!params[0].isAssignableFrom(LifecycleOwner.class)) {
                    throw new IllegalArgumentException(
                            "invalid parameter type. Must be one and instanceof LifecycleOwner");
                }
            }
            Lifecycle.Event event = annotation.value();
            //如果有2个参数
            if (params.length > 1) {
                callType = CALL_TYPE_PROVIDER_WITH_EVENT;
                //第2个参数必须是Lifecycle.Event
                if (!params[1].isAssignableFrom(Lifecycle.Event.class)) {
                    throw new IllegalArgumentException(
                            "invalid parameter type. second arg must be an event");
                }
                //有2个参数,注解值只能是ON_ANY
                if (event != Lifecycle.Event.ON_ANY) {
                    throw new IllegalArgumentException(
                            "Second arg is supported only for ON_ANY value");
                }
            }
            //如果参数超过2个
            if (params.length > 2) {
                throw new IllegalArgumentException("cannot have more than 2 params");
            }
            MethodReference methodReference = new MethodReference(callType, method);
            //将methodReference对应的event存入handlerToEvent
            verifyAndPutHandler(handlerToEvent, methodReference, event, klass);
        }
        CallbackInfo info = new CallbackInfo(handlerToEvent);
        //将观察者类对应的CallbackInfo存入mCallbackMap中
        mCallbackMap.put(klass, info);   
        mHasLifecycleMethods.put(klass, hasLifecycleMethods);
        return info;
    }

    static class CallbackInfo {
        //Lifecycle.Event对应的方法
        final Map<Lifecycle.Event, List<MethodReference>> mEventToHandlers;
        //方法对应的Lifecycle.Event
        final Map<MethodReference, Lifecycle.Event> mHandlerToEvent;

        CallbackInfo(Map<MethodReference, Lifecycle.Event> handlerToEvent) {
            mHandlerToEvent = handlerToEvent;
            mEventToHandlers = new HashMap<>();
            //遍历handlerToEvent,将Lifecycle.Event对应的方法存入mEventToHandlers
            for (Map.Entry<MethodReference, Lifecycle.Event> entry : handlerToEvent.entrySet()) {
                Lifecycle.Event event = entry.getValue();
                List<MethodReference> methodReferences = mEventToHandlers.get(event);
                if (methodReferences == null) {
                    methodReferences = new ArrayList<>();
                    mEventToHandlers.put(event, methodReferences);
                }
                methodReferences.add(entry.getKey());
            }
        }
    }    
}

因为反射是比较昂贵的,上面使用了ClassesInfoCache类来缓存实现了LifecycleObserver接口的类以及其中的Lifecycle.Event和对应的方法,主要使用了3个HashMap:

  1. mCallbackMap:缓存观察者类对应的CallbackInfo。
  2. mEventToHandlers:CallbackInfo的成员变量,缓存Lifecycle.Event对应的方法。
  3. mHandlerToEvent:CallbackInfo的成员变量,缓存方法对应的Lifecycle.Event。

接着回到ReflectiveGenericLifecycleObserver的onStateChanged()方法,onStateChanged()方法会调用CallbackInfo的invokeCallbacks()方法:

java 复制代码
final class ClassesInfoCache {

    static class CallbackInfo {

        void invokeCallbacks(LifecycleOwner source, Lifecycle.Event event, Object target) {
            invokeMethodsForEvent(mEventToHandlers.get(event), source, event, target);
            invokeMethodsForEvent(mEventToHandlers.get(Lifecycle.Event.ON_ANY), source, event,
                    target);
        }

        private static void invokeMethodsForEvent(List<MethodReference> handlers,
                LifecycleOwner source, Lifecycle.Event event, Object mWrapped) {
            if (handlers != null) {
                //遍历Lifecycle.Event对应的MethodReference
                for (int i = handlers.size() - 1; i >= 0; i--) {
                    //执行MethodReference的invokeCallback()方法
                    handlers.get(i).invokeCallback(source, event, mWrapped);
                }
            }
        }
    }
}

最终通过遍历该event对应的List<MethodReference>,然后一个个执行MethodReference的invokeCallback()方法:

arduino 复制代码
final class ClassesInfoCache {

    static final class MethodReference {
        final int mCallType;
        final Method mMethod;

        void invokeCallback(LifecycleOwner source, Lifecycle.Event event, Object target) {     
            switch (mCallType) {
                case CALL_TYPE_NO_ARG:
                    mMethod.invoke(target);//没有参数的
                    break;
                case CALL_TYPE_PROVIDER:
                    mMethod.invoke(target, source);//一个参数的:LifecycleOwner
                    break;
                case CALL_TYPE_PROVIDER_WITH_EVENT:
                    mMethod.invoke(target, source, event);//两个参数的:LifecycleOwner,Event
                    break;
            }  
        }
    }
}

上面就是分发相应的事件,就会调用观察者中对应的方法的流程。

前面的calculateTargetState()方法再解释一下:

java 复制代码
 // we have to keep it for cases:
 // void onStart() {
 //     mRegistry.removeObserver(this);
 //     mRegistry.add(newObserver);
 // }
 // newObserver should be brought only to CREATED state during the execution of
 // this onStart method. our invariant with mObserverMap doesn't help, because parent observer
 // is no longer in the map.
private ArrayList<State> mParentStates = new ArrayList<>();

private State calculateTargetState(LifecycleObserver observer) {
   Entry<LifecycleObserver, ObserverWithState> previous = mObserverMap.ceil(observer);

   State siblingState = previous != null ? previous.getValue().mState : null;
   State parentState = !mParentStates.isEmpty() ? mParentStates.get(mParentStates.size() - 1)
           : null;
   return min(min(mState, siblingState), parentState);
}

previous是新观察者的前一个entry,即原先的队尾,新观察者此时变成队尾。获取目标状态,previous即为当前状态的最小值。

假如没有mParentStates,好像还正常,然后注释给了一个反例:

  • Observer1 在 onStart() 回调中把自己从集合中移除,然后添加了新的Observer2;
  • 假如集合中只有Observer1这个观察者,移除后集合就是空的,会导致Observer2直接更新到LifecycleRegister的STARTED状态;
  • 但,此时Observer1的 onStart() 回调还未执行完,而 Observer2 的 ON_START就回调执行完了,显然就违背了LifecycleRegistry的设计------观察者的同步是按照顺序执行的(这里没懂);

添加了这个属性,在执行观察者回调前 pushParentState() 暂存当前观察者,回调完后 popParentState() 移除观察者,然后执行 calculateTargetState() 时判断是否为空,不为空取出最后一个缓存的观察者,然后取:LifecycleRegister当前状态、previous当前状态、缓存观察者状态中的最小值,作为当前观察者的状态。

感谢与参考

"终于懂了"系列:Jetpack AAC完整解析(一)Lifecycle 完全掌握!

Lifecycle官方文档

相关推荐
我命由我123453 天前
Android 广播 - 组件通信
android·java·开发语言·android studio·android jetpack·android-studio·android runtime
alexhilton3 天前
为什么你的 LazyColumn 仍然卡顿
android·kotlin·android jetpack
hai_android4 天前
Android 嵌套滑动冲突:内部拦截 vs 外部拦截实战
android·android studio·android jetpack
alexhilton7 天前
模块化Jetpack Compose架构
android·kotlin·android jetpack
hai_android7 天前
InputStage 责任链核心执行流程
android·android studio·android jetpack
传奇开心果编程9 天前
【现代声明式UI学与练】第4课 列表渲染与 key——如何高效渲染列表、key 的作用、列表重排时的状态保持
学习·flutter·react native·ui·swiftui·android jetpack
传奇开心果编程9 天前
【现代声明式UI学与练】第7课 组件通信——父传子、子传父、跨层级通信、状态提升与 Context
学习·flutter·react native·ui·swiftui·android jetpack
传奇开心果编程10 天前
【现代声明式UI学与练】第9课 性能优化——渲染优化、列表优化、内存优化、启动优化
学习·flutter·react native·ui·性能优化·swiftui·android jetpack
天空之城--12 天前
Android一周动态:Android 18首次官宣、Compose Material3 1.4转正(5趋势+5资讯)
android·人工智能·flutter·架构·android jetpack
传奇开心果编程13 天前
【现代声明式UI学与练】第1课 从命令式UI到声明式UI
学习·flutter·ui·swiftui·react·android jetpack