简介:
在Android中, WindowManagerService负责对系统中的所有窗口进行管理。所谓的
管理大致包括对窗口进行创建、删除,以及更换窗口的焦点。窗口一般是一个独立的界面,
比如一个对话框的窗口,一个Activity的交互窗口,一个菜单等;”Window”是一个类,
它的实现类是PhoneWindow,Activity类实现了Window.CallBack接口,从而成了具有通
用操作方式的窗口。View也是一个类,通常翻译为一个视图,指一个独立的交互元素,比
如一个按钮,一个文本框等。

作用:

为所有窗口分配Surface。客户端向WMS添加一个窗口的过程,其实就是WMS为其分配一块Suiface的过程,一块块Surface在WMS的管理下有序的排布在屏幕上。Window的本质就是Surface。
管理Surface的显示顺序、尺寸、位置
管理窗口动画
输入系统相关:WMS是派发系统按键和触摸消息的最佳人选,当接收到一个触摸事件,它需要寻找一个最合适的窗口来处理消息,而WMS是窗口的管理者,系统中所有的窗口状态和信息都在其掌握之中,完成这一工作不在话下。

W类
WindowManagerService服务就可以通过它在内部所创建的WindowState对象的成员变量mClient来
要求运行在应用程序进程这一侧的Activity组件来配合管理窗口的状态,例如:
1. 当一个Activity组件的窗口的大小发生改变后,WindowManagerService服务就会调用这个
IWindow接口的成员函数resized来通知该Activity组件,它的大小发生改变了。
2. 当一个Activity组件的窗口的可见性之后,WindowManagerService服务就会调用这个Iwindow
接口的成员函数dispatchAppVisibility来通知该Activity组件,它的可见性发生改变了。
3. 当一个Activity组件的窗口获得或者失去焦点之后,WindowManagerService服务就会调用这个
IWindow接口的成员函数windowFoucusChanged来通知该Activity组件,它的焦点发生改变了。

Window类

Window.java位于\frameworks\base\core\java\android\view中,它概括了Android窗口的基本属性和基本功能。

每个App虽然都可以做得各不相同,但是作为有大量用户交互的系统,窗口之间必须要有统一的交互模式,这样才能减小用户的学习成本。这些共性比如title, action bar的显示和通用按键的处理等等。Window类就抽象了这些共性。另外,它定义了一组Callback,Activity通过实现这些Callback被调用来处理事件。注意要和在WMS中的窗口区分开来,WMS中的窗口更像是App端的View。

作用:
 一、定义Callback接口,它包含一系列dispatchXxxx方法和一系列onXxxx方法,用于处理UI事件;
二、定义了一些接口,如setContentView、findViewById()等。由PhoneWindow来实现。

WindowManager类
WindowManager继承自ViewManager这个接口,这个接口主要有以下的实现子接口:
addView(); updateViewLayout(); removeView();
WindowManager可以添加view到屏幕,也可以从屏幕删除view。它面向的对象一端是屏幕,另一端就是View,通过WindowManager的 addView方法创建View,这样产生出来的View根据WindowManager.LayoutParams属性不同,效果也就不同了。比如创建系统顶级窗口,实现悬浮窗口效果。WindowManager的方法很简单,基本用到的就是addView,removeView,updateViewLayout接口。
我们每次创建一个Activity的时候,同样也是要添加当前Activity的View到窗口上,这个View是DecorView,同样也是通过调用addview()方法来实现。具体在ActivityRecord.java里面的handleResumeActivity来实现的。

ViewRootImpl类
ViewRootImpl这个类在android的UI结构中扮演的是一个中间者的角色,连接的是PhoneWindow
和WindowManagerService.也就是窗口管理系统与窗口呈现系统之间的桥梁。
它的主要作用有两个:

  1. 向DecorView分发收到的用户发起的event事件,如按键,触屏等事件;
  2. 与WindowManagerService交互,完成整个Activity的GUI的绘制。
    里面两个重要的变量 mWindowSessoin和mWindow。
    mWindowSessoin是ViewRootImpl和WindowManagerService之间的一个会话层,它的实体是
    在WMS中定义,作为ViewRootImpl 向WMS发送请求的的桥梁。
    mWindow是ViewRootImpl提供给WMS,以便WMS反向通知ViewRootImpl的接口。由于
    ViewRootImpl处在application端,而WMS处在system_server端,它们处在不同的进程,因此需要添
    加这个W接口,便于WMS向ViewRootImpl传递信息。

WindowState:
WMS中最基本的元素,描述WMS中的一个窗口。它既可以是由App添加过来的View,也可以是系统创建的系统窗口。mAttrs为WindowManager.LayoutParams类型,描述布局参数。mClient为IWindow类型,也就是App端的ViewRootImpl::W。为了查找方便,WMS中的mWindowMap保存了IWindow到WindowState的映射,mTokenMap保存了IApplicationToken到WindowToken的映射。

Session:
向App提供IWindowSession接口让其可以和WMS通信。每个App在WMS有一个Session对象,App就是通过这个Session来向WMS发出窗口管理申请的。命令dumpsys window sessions可以查看系统中的Session

WindowToken:
描述WM中一组相关的窗口,这些Window对应的WindowState放在其成员变量windows里。其主要继承类AppWindowToken,它是针对App的WindowToken结构。WindowState中的mAppToken指向所属的AppWindowToken,如果是系统窗口,mAppToken为空,mToken指向WindowToken对象。

AppWindowToken:
每个App的Activity对应一个AppWindowToken。其中的appToken为IApplicationToken类型,连接着对应的AMS中的ActivityRecord::Token对象,有了它就可以顺着AppWindowToken找到AMS中相应的ActivityRecord。其中allAppWindows是一个无序的列表,包含该Activity中所有的窗口。用dumpsys window display可以查看z-ordered的AppWindowToken列表:

AMS主要类关系图
WMS介绍
WMS主要类关系图
WMS介绍

AMS、WMS数据结构关联
WMS介绍TaskStack

AppWindowToken保存了属于它的WindowState的有序列表,而它本身也作为一个列表被管理在TaskStack中的mTasks成员中.

TaskStack中有个重要的变量mBounds,
在相同Task里的AppWindowToken对应的Activity的大小是相同的。所以mBounds代表的就是Activity对应的大小
WMS介绍
DisplayContent:
表示一个显示设备上的内容,这个显示设备可以是外接显示屏,也可以是虚拟显示屏。其中 mWindows是一个WindowState的有序(Z-ordered,底部最先)列表。mStackBoxes包含了若干个StackBox,其中 一个为HomeStack,另一个是App的StackBox。所有的StackBox被组织成二叉树,StackBox是其中的节点,其中有三个重要成 员变量,mFirst和mSecond指向左和右子结点(也是StackBox),StackBox的成员mStack才是我们真正关心的东西 -TaskStack。可以看到,为了要把TaskStack存成树的结构,需要一个容器,这个容器就是StackBox。

ActivityRecord:描述单个Activity,Activity堆栈中的基本单元。
TaskRecord:TaskRecord中的mActivities是ActivityRecord的列表,它们是按照历史顺序排序的。

ActivityStack:Activity堆栈,其中的ActivityRecord是通过TaskRecord这一层间接地被管理着。

相关文章: