根据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对象