WindowManager系列(三)WindowManager的实例获得及其来源探索

一 获取windowManager实例

在Activity中,获得windowManager的实例有

1.getWindowManager()方法

点进去其实可以发现是

  /** Retrieve the window manager for showing custom windows. */
    public WindowManager getWindowManager() {
        return mWindowManager;
    }

直接返回了activity的成员变量

2.getSystemService(WINDOW_SERVICE) 方法

点进去发现

    @Override
    public Object getSystemService(@ServiceName @NonNull String name) {
        if (getBaseContext() == null) {
            throw new IllegalStateException(
                    "System services not available to Activities before onCreate()");
        }

        if (WINDOW_SERVICE.equals(name)) {
            return mWindowManager;
        } else if (SEARCH_SERVICE.equals(name)) {
            ensureSearchManager();
            return mSearchManager;
        }
        return super.getSystemService(name);
    }

如果是window_service的话,还是返回的成员变量mWindowManager

也就是说,不论使用哪种方法,最后获取到的windowManager其实都是activity的成员变量,

上面两种获取windowmanager的方法本质是一样的

二 activity的windowManager哪里来

既然上面的两种方法是一样的,那么这个mWindowManager是怎么实例化,怎么赋值 的呢?继续探索

可以发现第7090行 attach方法中

        mWindow.setWindowManager(
                (WindowManager)context.getSystemService(Context.WINDOW_SERVICE),
                mToken, mComponent.flattenToString(),
                (info.flags & ActivityInfo.FLAG_HARDWARE_ACCELERATED) != 0);
        if (mParent != null) {
            mWindow.setContainer(mParent.getWindow());
        }
        mWindowManager = mWindow.getWindowManager();

这样可以知道,其实activity中的windowManager还是来自context.getSystemService方法

这里Activity中的attach方法中的context其实就是上一篇文章提到的mBase

也就是说,如果要溯源,还是要从ContextImpl的getSystemService方法来寻找。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值