ActivityLifecycleCallbacks的原理分析

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

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

相关推荐

精选
ViewPager和PagerAdapter、FragmentPagerAdapter、FragmentStatePager
Android

ViewPager和PagerAdapter、FragmentPagerAdapter、FragmentStatePager

ViewPager1、ViewPagerandroidx.viewpager.widget.ViewPager,Android中使用非常广泛的控件,可以说是APP必备:首次打开引导页、页面Banner广告等。常用方法:setAdapter() 设置适配器setOffscreenPageLimit() 设置缓存的页面个数,默认是 1setCurrentItem() 跳转到特定的页面setOnPage

1.1k
获取Android内置WebView内核版本
Android

获取Android内置WebView内核版本

获取Android内置WebView内核版本竟然能遇到这样奇葩的事情,网页用的技术过于新颖,以至于只支持高版本Chromium内核的,低版本安卓系统中内置的内核版本较低,无法加载前端页面。1、设置查看在系统设置里 > 应用 > 应用管理 > 显示系统应用,查看WebView组件:2、页面查看通过WebView发起的网络请求,都会带上浏览器的UA,通常页面都可以通过UA判断浏览器的内核版本。这里有两

1.1w
Android 14适配总结
Android

Android 14适配总结

Android 14适配总结毕业工作至今已经适配了三个Android大版本,从Android 11到Android 12、再到Android 13。2023年,Google即将推出的Android 14,上半年已经开始第一批适配。现在,第四个Android版本已经适配完,总结记录一下。1、Android 14计划Google一般会在2月份对外发布预告,同时放出开发者预览版。“拉通”各大平台、厂商以

1.1w