美文网首页
Window Manager Service

Window Manager Service

作者: HillLi | 来源:发表于2018-08-14 10:49 被阅读0次

IPC架构

应用开发者通过 WindowManager.addView向系统申请一个窗口,App进程内的Framework最终调用WindowManagerGlobal.addView,这里记录了View和窗口参数,还将为View新建一个ViewRoot

root = new ViewRootImpl(view.getContext(), display);
view.setLayoutParams(wparams);

//添加到全局变量
mViews.add(view);
mRoots.add(root);
mParams.add(wparams);

try {
  //把View记录到ViewRoot的mView中,因为接下来ViewRoot要频繁访问
  root.setView(view, wparams, panelParentView);
} catch (RuntimeException e) {
  //…
}
  • ViewRoot即是View 布局系统的引擎,也是系统窗口管理的对接者
  • ViewRoot通过IWindowSession访问WMS
  • WMS又通过IWindow反过来访问ViewRoot

在ViewRoot的构造器中:

public ViewRootImpl(Context context, Display display) {
    Context = context;
    //获取连接
    mWindowSession = WindowManagerGlobal.getWindowSession();
    //…
    //IWindow对象,WMS将通过它管理
    mWindow = new W(this);
    //…
}

IWindowSession在服务端的实现是Session,ViewRoot.setView调用远程的WindowSession.addToDisplay

class Session extends IWindowSession.Stub{
    @Override
    public int addToDisplay(IWindow window, …) {
          return mService.addWindow(this, window, …);
    }
}

ViewRoot通过IWindowSeession.addToDisplay向WMS添加mWindow(W对象,IWindow子类),使WMS也可以访问Window,实现双向通信。

public void setView(View view, WindowManager.LayoutParams attrs, View panelParentView)
{
    //…
    res = mWindowSession.addToDisplay(mWindow, …);
    //…
}

调用流程:

wms-relation.png

应用和窗口是一对多的关系,所以每个窗口都要和窗口有个独立的seesion

WMS添加窗口

主要成员变量

  • mSessions: WindowSession列表,与各窗口通信
  • mTokenMap: WindowToken列表,一个token关联一系列有联系的窗口
  • mWindowMap: WindowState列表,代表窗口
  • mPolicy: 即 PhoneWindowManager

addWindow的具体流程

  1. 权限检查
  2. WMS保存一个"窗口-状态"的键值对表,检查是否重复添加
  3. 如果是子窗口,那么它的父窗口不能也是子窗口
  4. 根据不同窗口类型,确定是否加WindowToken(窗口令牌)
  5. 为新增的窗口新建一个WindowState
  6. 如果客户端死亡,则不再执行
  7. 窗口参数调整
  8. 如果新增了WindowToken,添加到全局表
  9. 重新调整窗口顺序
  10. 计算窗口大小
  11. 分配最终层级值

相关文章

网友评论

      本文标题:Window Manager Service

      本文链接:https://www.haomeiwen.com/subject/smpmbftx.html