ActivityLifecycleCallbacks的原理分析

Quibbler 2020-11-23 1036

ActivityLifecycleCallbacks的原理分析


        在Activity生命周期监听ActivityLifecycleCallbacks中了解到ActivityLifecycleCallbacks用来监控Activity的生命周期,它的实现原理也不难,在框架中新增接口及相关的回调即可。现在来分析一下其中的原理。



1、mActivityLifecycleCallbacks集合

        在Application中调用registerActivityLifecycleCallbacks(ActivityLifecycleCallbacks callback)方法注册ActivityLifecycleCallbacks 回调

    public void registerActivityLifecycleCallbacks(ActivityLifecycleCallbacks callback) {
        synchronized (mActivityLifecycleCallbacks) {
            mActivityLifecycleCallbacks.add(callback);
        }
    }

        这里mActivityLifecycleCallbacksApplication类中的集合类型成员变量,注册的实例会被添加到该集合中

    @UnsupportedAppUsage
    private ArrayList<ActivityLifecycleCallbacks> mActivityLifecycleCallbacks = new ArrayList<ActivityLifecycleCallbacks>();



2、collectActivityLifecycleCallbacks()方法

        mActivityLifecycleCallbacks除了在声明和添加移除修改数据集合的地方,还有另一个方法中被访问:collectActivityLifecycleCallbacks()

    @UnsupportedAppUsage
    private Object[] collectActivityLifecycleCallbacks() {
        Object[] callbacks = null;
        synchronized (mActivityLifecycleCallbacks) {
            if (mActivityLifecycleCallbacks.size() > 0) {
                callbacks = mActivityLifecycleCallbacks.toArray();
            }
        }
        return callbacks;
    }

        将mActivityLifecycleCallbacks集合转成Object[]数组,在下面21个dispatchActivity***()回调方法中被调用(共7组不同生命周期的回调,每组3个回调方法:前中后)

    // ------------------ Internal API ------------------
    @UnsupportedAppUsage
    void dispatchActivityPreCreated(@NonNull Activity activity,
            @Nullable Bundle savedInstanceState) {
        Object[] callbacks = collectActivityLifecycleCallbacks();
        if (callbacks != null) {
            for (int i = 0; i < callbacks.length; i++) {
                ((ActivityLifecycleCallbacks) callbacks[i]).onActivityPreCreated(activity,
                        savedInstanceState);
            }
        }
    }
    
    @UnsupportedAppUsage
    void dispatchActivityCreated(@NonNull Activity activity,
            @Nullable Bundle savedInstanceState) {
        Object[] callbacks = collectActivityLifecycleCallbacks();
        if (callbacks != null) {
            for (int i=0; i<callbacks.length; i++) {
                ((ActivityLifecycleCallbacks)callbacks[i]).onActivityCreated(activity,
                        savedInstanceState);
            }
        }
    }
    
    @UnsupportedAppUsage
    void dispatchActivityPostCreated(@NonNull Activity activity,
            @Nullable Bundle savedInstanceState) {
        Object[] callbacks = collectActivityLifecycleCallbacks();
        if (callbacks != null) {
            for (int i = 0; i < callbacks.length; i++) {
                ((ActivityLifecycleCallbacks) callbacks[i]).onActivityPostCreated(activity,
                        savedInstanceState);
            }
        }
    }
    ...



3、dispatchActivity流程


3.1、dispatchActivityCreated

        来看看ApplicationdispatchActivityCreated(Activity activity,Bundle savedInstanceState)方法在哪里被回调的,之前有看过Activity初始化流程,详见Activity启动流程源码分析。在Activity的onCreate()方法中

    @MainThread
    @CallSuper
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        ...
        mFragments.dispatchCreate();
        dispatchActivityCreated(savedInstanceState);
        ...
    }

        调用Activity中的dispatchActivityCreated(Bundle savedInstanceState)方法,在这里进行ActivityLifecycleCallbacks的回调分发。

    private void dispatchActivityCreated(@Nullable Bundle savedInstanceState) {
        getApplication().dispatchActivityCreated(this, savedInstanceState);
        Object[] callbacks = collectActivityLifecycleCallbacks();
        if (callbacks != null) {
            for (int i = 0; i < callbacks.length; i++) {
                ((Application.ActivityLifecycleCallbacks) callbacks[i]).onActivityCreated(this,
                        savedInstanceState);
            }
        }
    }

        getApplication()获取的就是当前Application,Activity初始化的时候会持有当前的Application引用。调用Application的dispatchActivityCreated(Activity activity, Bundle savedInstanceState)方法,前面提到过,在这里对注册的ActivityLifecycleCallbacks监听器一个一个执行回调onActivityCreated方法。

    @UnsupportedAppUsage
    /* package */ void dispatchActivityCreated(@NonNull Activity activity,
            @Nullable Bundle savedInstanceState) {
        Object[] callbacks = collectActivityLifecycleCallbacks();
        if (callbacks != null) {
            for (int i=0; i<callbacks.length; i++) {
                ((ActivityLifecycleCallbacks)callbacks[i]).onActivityCreated(activity,
                        savedInstanceState);
            }
        }
    }

        值得注意的是,Activity也新增了mActivityLifecycleCallbacks集合,并且支持在Activity中进行注册和反注册。这是从API 29才开始的。


3.2、dispatchActivityPreCreated/dispatchActivityPostCreated

        那么dispatchActivityPreCreated和dispatchActivityPostCreated又是在哪里回调的呢?这就看源码哪里开始创建Activity的:

    @UnsupportedAppUsage
    final void performCreate(Bundle icicle, PersistableBundle persistentState) {
        dispatchActivityPreCreated(icicle);  //================= dispatchActivityPre 
        mCanEnterPictureInPicture = true;
        restoreHasCurrentPermissionRequest(icicle);
        if (persistentState != null) {
            onCreate(icicle, persistentState);
        } else {                            //================== dispatchActivity 
            onCreate(icicle);
        }
        writeEventLog(LOG_AM_ON_CREATE_CALLED, "performCreate");
        mActivityTransitionState.readState(icicle);
        mVisibleFromClient = !mWindow.getWindowStyle().getBoolean(
                com.android.internal.R.styleable.Window_windowNoDisplay, false);
        mFragments.dispatchActivityCreated();
        mActivityTransitionState.setEnterActivityOptions(this, getActivityOptions());
        dispatchActivityPostCreated(icicle);  //================ dispatchActivityPost
    }

        Activity创建的时候被InstrumentationcallActivityOnCreate(Activity activity, Bundle icicle)方法调用

    public void callActivityOnCreate(Activity activity, Bundle icicle) {
        prePerformCreate(activity);
        activity.performCreate(icicle);
        postPerformCreate(activity);
    }

         调用ActivityperformCreate()方法,Android框架在新增回调接口的时候选择了最合适的位置进行“插桩”,在该方法中的开始、中间和结束分别分发回调:

dispatchActivityPre -> dispatchActivity -> dispatchActivityPost



不忘初心的阿甘
最新回复 (0)
    • 安卓笔记本
      2
        登录 注册 QQ
返回
仅供学习交流,切勿用于商业用途。如有错误欢迎指出:fluent0418@gmail.com