WindowManager系列(二)Activity中的mBase及其初始化时机

根据Android28源码

一.在Activity中的初始化位置(Activity的attach方法

mbase这个成员变量是Activity中非常重要的一个成员变量,它被定义在

ContextWrapper类中,赋值也是在这个类中,其他Context的子类中没有发现对它的赋值

那么,赋值的时机在哪里呢?

通过sourceInsight都搜索功能,可以发现一共只有两个赋值方法

第一个赋值方法

  public ContextWrapper(Context base) {
        mBase = base;
    }

这个方法通过搜索发现没有有意义的赋值的地方

那么只剩第二个方法

    /**
     * Set the base context for this ContextWrapper.  All calls will then be
     * delegated to the base context.  Throws
     * IllegalStateException if a base context has already been set.
     * 
     * @param base The new base context for this wrapper.
     */
    protected void attachBaseContext(Context base) {
        if (mBase != null) {
            throw new IllegalStateException("Base context already set");
        }
        mBase = base;
    }

而在activity中调用这个方法的“attachBaseContext”的地方只有一处,即

activity中的attach方法。

也就是说,对于activity来说,其mbase是在attach方法中初始化的。

 

二调用attch方法的位置(ActivityThread的performLauncherActivity

那么,又是谁调用了Activity的attach方法并把mBase传入呢

继续使用sourceInsight的搜索功能,可以看到调用activity的attach方法有两处,

其中Instrumentation中一处是为了unittest的。

其可以搜到的两处调用(newActivity)都没有什么系统意义

----------------------------------------------------------------------------------------------------

所以attch方法的真正调用位置我们找到了,即ActivityThread的

performLauncherActivity方法

通过查看上面的源码可知mBase其实是一个ContextImpl对象

 

你可能感兴趣的:(安卓)