ActivityLifecycleCallbacks的原理分析

QuibblerQuibbler 2020-11-23 约 16 分钟 2576 次阅读

ActivityLifecycleCallbacks的原理分析

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

1、mActivityLifecycleCallbacks集合

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

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

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

@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

来看看Application的dispatchActivityCreated(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创建的时候被Instrumentation类callActivityOnCreate(Activity activity, Bundle icicle)方法调用

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

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

dispatchActivityPre -> dispatchActivity -> dispatchActivityPost

相关推荐