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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值