目录

再来看看 WMS

这几天想重新研究研究一些 Android Framework 相关的东西,看到了 WindowManagerService(WMS),产生了一些疑问。

getSystemService(“window”)获取的是什么

很多人说是,WMS 的代理对象,可是目前我看的 android-28 的源码,发现并不是这样。

getSystemService 方法在 SystemServiceRegistry.java 中

其中和 WMS 相关的是

 registerService(Context.WINDOW_SERVICE, WindowManager.class,
                new CachedServiceFetcher<WindowManager>() {
    @Override
    public WindowManager createService(ContextImpl ctx) {
        return new WindowManagerImpl(ctx);
}});

所以我们拿到的是一个叫做 WindowManagerImpl 的类,并不是什么 binder 代理对象

WindowManagerImpl 是什么

public final class WindowManagerImpl implements WindowManager {
    private final WindowManagerGlobal mGlobal = WindowManagerGlobal.getInstance();
}

省略了很多代码,WindowManagerImpl 实现了 WindowManager 接口,但是这也和 binder 毫无关系,这个接口就是一个普通接口。

那么 WindowManagerImpl 又是怎么跨进程调用 WMS 的方法的呢?

WindowManagerGlobal

WindowManagerImpl 总共就100多行,其中 addView 等方法,都会调用到 WindowManagerGlobal 中去。

当打开 WindowManagerGlobal.java 时,就会发现,它才是与 WMS 交互的核心也可以说不是核心。

为什么?

仔细看看代码,其实就是 getWindowManagerService 和 getWindowSession 两个核心方法

getWindowSession 依赖于 getWindowManagerService 调用,返回的 WindowSession 就是一个 binder 对象,是丢给 ViewRootImpl 和 WMS 通信使用。

其他的方法,比如 addView 其实是交给了 ViewRootImpl 来处理,ViewRootImpl 通过 WindowSession 和 WMS 通信。

所以 WindowManagerGlobal 这个类,最大的作用就是可以提供 WindowSession 和 WMS,具体的逻辑它自己并不处理,都是丢给别人这两个代理对象,让别人去远程调用。