查看原文
其他

你要的进阶,Jetpack核心组件Lifecycle的使用和源码解析

潇风寒月 郭霖 2019-05-13



今日科技快讯


近日,苹果和高通已同意了结所有正在进行的专利侵权诉讼,结束这两家科技巨头在全球相互起诉的的法律大战。作为和解协议的一部分,苹果同意向高通支付一笔金额不详的款项。此外,两家公司已达成一项为期6年的全球专利授权协议,该协议可能会再延长两年。


作者简介


大家早上好,本篇文章来自 潇风寒月 的投稿,和大家分享了Jetpack架构组件下Lifecycle的使用及原理解析,相信会对大家有所帮助!同时也感谢作者贡献的精彩文章。

潇风寒月的博客地址:

https://me.csdn.net/xfhy_


使用Lifecycle


Lifecycle是Android Architecture Components的一员,这玩意儿挺方便的,它是能感知Activity和Fragment的生命周期的。

引入Lifecycle

我们来看一下如何引入。

  • 非androidX项目引入

//运行时
implementation "android.arch.lifecycle:runtime:1.1.1"
// 编译期
annotationProcessor "android.arch.lifecycle:compiler:1.1.1"
  • androidX项目引入

androidX是support库的新时代,Google正在将support迁移到androidx中。

implementation "androidx.lifecycle:lifecycle-runtime:2.0.0"
implementation "androidx.lifecycle:lifecycle-extensions:2.0.0"
implementation "androidx.lifecycle:lifecycle-common-java8:2.0.0"
annotationProcessor  "androidx.lifecycle:lifecycle-compiler:2.0.0"

创建生命周期观察者

public class MyObserver implements LifecycleObserver {

    private static final String TAG = "MyObserver";

    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)  
    public void onCreate() {
        Log.w(TAG, "onCreate: ");
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    public void onStart() {
        Log.w(TAG, "onStart: ");
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    public void onResume() {
        Log.w(TAG, "onResume: ");
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    public void onPause() {
        Log.w(TAG, "onPause: ");
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    public void onStop() {
        Log.w(TAG, "onStop: ");
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    public void onDestroy() {
        Log.w(TAG, "onDestroy: ");
    }

}

我们首先创建了一个类,它实现了LifecycleObserver接口,并且我写了几个模拟生命周期的方法,并在每个方法上加上了注解.

观察生命周期

然后我在Activity中这样写:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //添加一个生命周期观察者    getLifecycle()是FragmentActivity中的方法
        MyObserver observer = new MyObserver();
        getLifecycle().addObserver(observer);
    }
}

我们将项目运行起来,观察结果:

2019-03-12 22:14:26.672 15790-15790/? W/MyObserver: onCreate: 
2019-03-12 22:14:26.676 15790-15790/? W/MyObserver: onStart: 
2019-03-12 22:14:26.679 15790-15790/? W/MyObserver: onResume: 
2019-03-12 22:15:13.054 15790-15790/? W/MyObserver: onPause: 
2019-03-12 22:15:13.234 15790-15790/? W/MyObserver: onStop: 
2019-03-12 22:15:13.241 15790-15790/? W/MyObserver: onDestroy: 

我们发现,不管Activity的生命周期如何变化,我创建的观察者总是能够监听到响应的生命周期变化,并且变化时还会回调我写的生命周期方法(比如:public void onDestroy())。

方不方便?你可能会问,这有啥用?用处大了,比如我现在Presenter中就可以很方便的监听Activity中的生命周期,从而进行一些相应的操作和处理。


Lifecycle原理解析


从使用处入手

我们从使用的地方入手

MyObserver observer = new MyObserver();
getLifecycle().addObserver(observer);

getLifecycle()方法点进去是FragmentActivity,看注释意思是返回生命周期提供者的Lifecycle。

/**
 * Returns the Lifecycle of the provider.
 */

@Override
public Lifecycle getLifecycle() {
    return super.getLifecycle();
}

再跟着super.getLifecycle();进入,来到了ComponentActivity,可以看到,ComponentActivity是继承自Activity并实现了LifecycleOwner(该接口的作用是标记类有Android的生命周期的,比如Activity和Fragment)接口。

public class ComponentActivity extends Activity
        implements LifecycleOwner, KeyEventDispatcher.Component {

    private LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this);
    @Override
    public Lifecycle getLifecycle() {
        return mLifecycleRegistry;
    }   
}

/**
* A class that has an Android lifecycle
*/

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

那么其实最终是返回的LifecycleRegistry,它是Lifecycle的子类。

Lifecycle是一个抽象类,里面有3个方法(添加观察者和移除观察者,获取当前的状态),还有一些状态的枚举定义。

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();

    @SuppressWarnings("WeakerAccess")
    public enum Event {
        /**
         * Constant for onCreate event of the {@link LifecycleOwner}.
         */

        ON_CREATE,
        /**
         * Constant for onStart event of the {@link LifecycleOwner}.
         */

        ON_START,
        /**
         * Constant for onResume event of the {@link LifecycleOwner}.
         */

        ON_RESUME,
        /**
         * Constant for onPause event of the {@link LifecycleOwner}.
         */

        ON_PAUSE,
        /**
         * Constant for onStop event of the {@link LifecycleOwner}.
         */

        ON_STOP,
        /**
         * Constant for onDestroy event of the {@link LifecycleOwner}.
         */

        ON_DESTROY,
        /**
         * An {@link Event Event} constant that can be used to match all events.
         */

        ON_ANY
    }


    @SuppressWarnings("WeakerAccess")
    public enum State {

        DESTROYED,


        INITIALIZED,


        CREATED,


        STARTED,


        RESUMED;


        public boolean isAtLeast(@NonNull State state) {
            return compareTo(state) >= 0;
        }
    }
}

LifecycleRegistry是Lifecycle的一个实现,它是用在Fragment和Activity上的,它可以处理多个生命周期观察者。具体它有什么作用,后面再讲。

ReportFragment的由来

下面是ComponentActivity的onCreate()方法。

protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ReportFragment.injectIfNeededIn(this);
}

可以看到,在上面搞了一句,注入一个ReportFragment(报告Fragment?纪检委员?打小报告的?当然,我只是猜测)。

有一点眉目了,其实就是在Activity中搞了一个Fragment,Fragment的生命周期我们知道了,当然就知道了Activity的生命周期,接着通知相关的观察者即可。当然,这个Fragment是没有界面的。我们来看看,这个注入的方法干了啥。

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

    public static void injectIfNeededIn(Activity activity) {
        // ProcessLifecycleOwner should always correctly work and some activities may not extend
        // FragmentActivity from support lib, so we use framework fragments for activities
        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();
        }
}

其实这个injectIfNeededIn()看起来像是注入的方法干的就是将Fragment添加到Activity中,来看看这个ReportFragment的生命周期方法都干了些啥。

@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);
}

private void dispatchCreate(ActivityInitializationListener listener) {
    if (listener != null) {
        listener.onCreate();
    }
}
  1. 通过调用dispatchCreate(mProcessListener)方法,感觉从命名上(是不是有点像dispatchTouchEvent())看就知道是在干啥了:分发当前的生命周期事件。

  2. dispatch(Lifecycle.Event.ON_START); 感觉这个方法也像是在分发事件。

我们跟着这个mProcessListener来看看是在哪里设置的

/**
 * Class that provides lifecycle for the whole application process.
 */

public class ProcessLifecycleOwner implements LifecycleOwner {

    //注意,我是一个单例
    private static final ProcessLifecycleOwner sInstance = new ProcessLifecycleOwner();

    static void init(Context context) {
        sInstance.attach(context);
    }

    void attach(Context context) {
        mHandler = new Handler();
        mRegistry.handleLifecycleEvent(Lifecycle.Event.ON_CREATE);
        Application app = (Application) context.getApplicationContext();
        app.registerActivityLifecycleCallbacks(new EmptyActivityLifecycleCallbacks() {
            @Override
            public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
                ReportFragment.get(activity).setProcessListener(mInitializationListener);
            }

            @Override
            public void onActivityPaused(Activity activity) {
                activityPaused();
            }

            @Override
            public void onActivityStopped(Activity activity) {
                activityStopped();
            }
        });
    }
}

//Activity的监听器
ActivityInitializationListener mInitializationListener =
            new ActivityInitializationListener() {
                @Override
                public void onCreate() {
                }

                @Override
                public void onStart() {
                    activityStarted();
                }

                @Override
                public void onResume() {
                    activityResumed();
                }

private final LifecycleRegistry mRegistry = new LifecycleRegistry(this);

//Activity创建的时候,分发Lifecycle.Event.ON_START事件
void activityStarted() {
    mStartedCounter++;
    if (mStartedCounter == 1 && mStopSent) {
        mRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START);
        mStopSent = false;
    }
}
ReportFragment.java
static ReportFragment get(Activity activity) {

    return (ReportFragment) activity.getFragmentManager().findFragmentByTag(
            REPORT_FRAGMENT_TAG);
}

ProcessLifecycleOwner看起来就像是老大哥,给整个APP提供lifecycle的,也就是说通过它我们可以观察到整个应用程序的生命周期。如何做到的? ProcessLifecycleOwner的attach()中registerActivityLifecycleCallbacks()注册了一个监听器,一旦有Activity创建就给它设置一个Listener。这样就保证了每个ReportFragment都有Listener。

既然是一个全局的单例,并且可以监听整个应用程序的生命周期,那么,肯定一开始就需要初始化。

既然没有让我们在Application里面初始化,那么肯定就是在ContentProvider里面初始化的。

初始化

ps: 这里穿插一个小知识点:ContentProvider的onCreate()方法执行时间比Application的onCreate()执行时间还要早,而且肯定会执行。所以在ContentProvider的onCreate()方法里面初始化几个特殊的小东西是没啥问题的。

我们跟着ProcessLifecycleOwner的init()方法的调用处,来到了ProcessLifecycleOwnerInitializer,果不其然,它是一个ContentProvider。并且,在这里,真的就初始化了2个小东西。

public class ProcessLifecycleOwnerInitializer extends ContentProvider {
    @Override
    public boolean onCreate() {
        LifecycleDispatcher.init(getContext());
        ProcessLifecycleOwner.init(getContext());
        return true;
    }
}
  1. ProcessLifecycleOwner初始化就不说了,是拿来观察整个应用的生命周期的,其原理就是利用ReportFragment,我们稍后详细到来。

  2. LifecycleDispatcher尤其重要。

class LifecycleDispatcher {
    static void init(Context context) {
        ...
        //registerActivityLifecycleCallbacks  注册一个监听器
        ((Application) context.getApplicationContext())
                .registerActivityLifecycleCallbacks(new DispatcherActivityCallback());
    }
}
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) {
    }
}

初始化的时候,就注册了一个监听器,每个创建的时候都给它注入一个ReportFragment.咦?这里又来注入一次,不是每个Activity都注册了一次么,在ComponentActivity中,搞啥玩意儿?

我猜,可能是为了兼容吧。2次注入,确保万无一失。而且这个injectIfNeededIn()方法,内部实现是只会成功注入一次的,所以多调用一次,无所谓。

分发事件

相当于,到了这里,应用程序里面的任何一个Activity都会被注入一个ReportFragment。而注入的这个无界面的ReportFragment是可以观察到当然Activity的生命周期的。

下面我们来仔细看一下,这个事件是如何一步步分发下去的。

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

private void dispatch(Lifecycle.Event event) {
    Activity activity = getActivity();
    if (activity instanceof LifecycleRegistryOwner) {
        ((LifecycleRegistryOwner) activity).getLifecycle().handleLifecycleEvent(event);
        return;
    }

    if (activity instanceof LifecycleOwner) {
        //获取Activity中的LifecycleRegistry
        Lifecycle lifecycle = ((LifecycleOwner) activity).getLifecycle();
        if (lifecycle instanceof LifecycleRegistry) {
            ((LifecycleRegistry) lifecycle).handleLifecycleEvent(event);
        }
    }
}

不知道小伙伴儿们是否记得ComponentActivity是实现了LifecycleOwner的。

public class ComponentActivity extends Activity
        implements LifecycleOwner

下面我们获取到Activity中的LifecycleRegistry,下面的代码做了精简,只保留关键代码。

public void handleLifecycleEvent(@NonNull Lifecycle.Event event) {
    State next = getStateAfter(event);
    moveToState(next);
}

private void moveToState(State next) {
    ......
    sync();
    ......
}

private void sync() {
    LifecycleOwner lifecycleOwner = mLifecycleOwner.get();

    //循环 遍历所有观察者
    while (...) {
        ....
        //分发事件
        forwardPass(lifecycleOwner);
    }
}


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();
        }
    }
}

上面的observer其实是一个ObserverWithState对象。

static class ObserverWithState {
    State mState;
    GenericLifecycleObserver mLifecycleObserver;

    ObserverWithState(LifecycleObserver observer, State initialState) {
        mLifecycleObserver = Lifecycling.getCallback(observer);
        mState = initialState;
    }

    void dispatchEvent(LifecycleOwner owner, Event event) {
        State newState = getStateAfter(event);
        mState = min(mState, newState);
        //生命周期变了....  关键代码
        mLifecycleObserver.onStateChanged(owner, event);
        mState = newState;
    }
}

在ObserverWithState的构造方法中,通过 Lifecycling.getCallback(observer)根据传进来的observer,构造了一个GenericLifecycleObserver类型的 mLifecycleObserver ,我们跟进去看一下。

static GenericLifecycleObserver getCallback(Object object) {
    if (object instanceof FullLifecycleObserver) {
        return new FullLifecycleObserverAdapter((FullLifecycleObserver) object);
    }

    if (object instanceof GenericLifecycleObserver) {
        return (GenericLifecycleObserver) object;
    }

    final Class<?> klass = object.getClass();
    int type = getObserverConstructorType(klass);
    if (type == GENERATED_CALLBACK) {
        List<Constructor<? extends GeneratedAdapter>> constructors =
                sClassToAdapters.get(klass);
        if (constructors.size() == 1) {
            GeneratedAdapter generatedAdapter = createGeneratedAdapter(
                    constructors.get(0), object);
            return new SingleGeneratedAdapterObserver(generatedAdapter);
        }
        GeneratedAdapter[] adapters = new GeneratedAdapter[constructors.size()];
        for (int i = 0; i < constructors.size(); i++) {
            adapters[i] = createGeneratedAdapter(constructors.get(i), object);
        }
        return new CompositeGeneratedAdaptersObserver(adapters);
    }
    return new ReflectiveGenericLifecycleObserver(object);
}

这个方法大概意思就是,根据传进的LifecycleObserver进行判断,构造一个GenericLifecycleObserver(目前是只有4个子类:FullLifecycleObserverAdapter、SingleGeneratedAdapterObserver、CompositeGeneratedAdaptersObserver、ReflectiveGenericLifecycleObserver)的对象。

依赖注入

首先,这里穿插一点。我们在引入lifecycle时添加了语句annotationProcessor "android.arch.lifecycle:compiler:1.1.1",这个其实是注解处理器的依赖。

引入这个之后,会自动生成xxx_LifecycleAdapter的文件,上面的demo中生成的是MyObserver_LifecycleAdapter文件,其内容如下:

public class MyObserver_LifecycleAdapter implements GeneratedAdapter {
  final MyObserver mReceiver;

  MyObserver_LifecycleAdapter(MyObserver receiver) {
    this.mReceiver = receiver;
  }

  @Override
  public void callMethods(LifecycleOwner owner, Lifecycle.Event event, boolean onAny,
      MethodCallsLogger logger) {

    boolean hasLogger = logger != null;
    if (onAny) {
      return;
    }
    if (event == Lifecycle.Event.ON_CREATE) {
      if (!hasLogger || logger.approveCall("onCreate", 1)) {
        mReceiver.onCreate();
      }
      return;
    }
    if (event == Lifecycle.Event.ON_START) {
      if (!hasLogger || logger.approveCall("onStart", 1)) {
        mReceiver.onStart();
      }
      return;
    }
    if (event == Lifecycle.Event.ON_RESUME) {
      if (!hasLogger || logger.approveCall("onResume", 1)) {
        mReceiver.onResume();
      }
      return;
    }
    if (event == Lifecycle.Event.ON_PAUSE) {
      if (!hasLogger || logger.approveCall("onPause", 1)) {
        mReceiver.onPause();
      }
      return;
    }
    if (event == Lifecycle.Event.ON_STOP) {
      if (!hasLogger || logger.approveCall("onStop", 1)) {
        mReceiver.onStop();
      }
      return;
    }
    if (event == Lifecycle.Event.ON_DESTROY) {
      if (!hasLogger || logger.approveCall("onDestroy", 1)) {
        mReceiver.onDestroy();
      }
      return;
    }
  }
}

因为我们的事件是声明在MyObserver的方法注解上面的,每次去反射取这些东西,比较耗性能。那么我们通过该依赖库,把这些标注了的方法进行预处理,然后直接回调这些方法,避免反射,进行提高性能。666,佩服。

有了上面的知识之后,分析getCallback()方法,不难发现,因为MyObserver_LifecycleAdapter只有一个构造方法,那么就会构造出SingleGeneratedAdapterObserver。而SingleGeneratedAdapterObserver内部其实就是调用一下方法而已。

public class SingleGeneratedAdapterObserver implements GenericLifecycleObserver {

    private final GeneratedAdapter mGeneratedAdapter;

    SingleGeneratedAdapterObserver(GeneratedAdapter generatedAdapter) {
        mGeneratedAdapter = generatedAdapter;
    }

    @Override
    public void onStateChanged(LifecycleOwner source, Lifecycle.Event event) {
        mGeneratedAdapter.callMethods(source, event, false, null);
        mGeneratedAdapter.callMethods(source, event, true, null);
    }
}

上面的mGeneratedAdapter其实就是我们的MyObserver_LifecycleAdapter。好了,结束了。生命周期事件从Activity开始,然后到打小报告的ReportFragment那里出来,辗转发侧,终于到了我们定义的观察者,不容易啊。谷歌工程师写的代码就是牛逼。


推荐阅读:

当当购书节每满100减50,这波羊毛你必须得薅!

使用Google开源库AutoService进行组件化开发

像小红书一样的图片裁剪控件联动效果


欢迎关注我的公众号,学习技术或投稿

长按上图,识别图中二维码即可关注

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存