一 获取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方法来寻找。