Activity添加客户端窗口时序图
三、 窗口管理
Android的窗关管理是基于C/S模式的,并且使用独立进程的方式实现。窗口管理的服务端WindowManagerService运行在独立的进程system_server里,当应用程序需要创建窗口时,通过进程通信的方式请求WindowManagerService创建窗口,由WindowManagerService向应用程序传递和窗口相关的交互消息。所有程序的窗口都在服务端管理,窗口的显示和控制都在WindowManagerService里处理。
WindowManagerService主要完成了以下几部分功能:
1. 窗口的添加和删除
2. 窗口的显示和隐藏控制
3. Z-order顺序管理
4. 焦点窗口和焦点应用的管理
5. 输入法窗口管理和墙纸窗口管理
6. 转场动画
7. 系统消息收集和分发
服务端的实现代码是在/framework/base/services/java/com/android/server/wm/里,核心的几个类是:
WindowManagerService.java
WindowState.java
WindowToken.java
AppWindowToken.java
Session.java
InputManager.java
InputMonitor.java
类解释:
WindowManagerService负责完成窗口的管理工作;
WindowState和客户端窗口一一对应,应用调用WindowManager.addView()时,最终会在WindowManagerService添加一个WindowState与之一一对应。
WindowToken是一个句柄,保存了所有具有同一个token的WindowState。应用请求WindowManagerService添加窗口的时候,提供了一个token,该token标识了被添加窗口的归属,WindowManagerService为该token生成一个WindowToken对象,所有token相同的WindowState被关联到同一个WindowToken。如输入法添加窗口时,会传递一个mCurrToken&