-
为所有窗口分配Surface: 客户端向WMS添加一个窗口的过程,其实就是WMS为其分配一块Surface的过程,一块块Surface在WMS的管理下有序的排布在屏幕上。Window的本质就是Surface,用于管理Surface的显示顺序、尺寸、位置和窗口动画。
-
输入系统相关:WMS是派发系统按键和触摸消息的最佳人选,当接收到一个触摸事件,它需要寻找一个最合适的窗口来处理消息,而WMS是窗口的管理者,系统中所有的窗口状态和信息都在其掌握之中,完成这一工作不在话下。
============================================================================
WindowManagerService服务就可以通过它在内部所创建的WindowState对象的成员变量mClient来
要求运行在应用程序进程这一侧的Activity组件来配合管理窗口的状态,例如:
-
当一个Activity组件的窗口的大小发生改变后,WindowManagerService服务就会调用这个
IWindow接口的成员函数resized来通知该Activity组件,它的大小发生改变了。
-
当一个Activity组件的窗口的可见性之后,WindowManagerService服务就会调用这个Iwindow
接口的成员函数dispatchAppVisibility来通知该Activity组件,它的可见性发生改变了。
-
当一个Activity组件的窗口获得或者失去焦点之后,WindowManagerService服务就会调用这个
IWindow接口的成员函数windowFoucusChanged来通知该Activity组件,它的焦点发生改变了。
Window类 \frameworks\base\core\java\android\view\Window.java
理解:
-
它概括了Android窗口的基本属性和基本功能。
-
每个App虽然都可以做到各不相同,但是作为有大量用户交互的系统,窗口之间必须要有统一的交互模式,这样才能减小用户的学习成本。这些共性比如title, action bar的显示和通用按键的处理等,Window类就抽象了这些共性。
-
它定义了一组Callback,Activity通过实现这些Callback被调用来处理事件。
注意: 要和在WMS中的窗口区分开来,WMS中的窗口更像是App端的View。
具体作用:
-
定义Callback接口,它包含一系列dispatchXxxx方法和一系列onXxxx方法,用于处理UI事件。
-
定义了一些接口,如setContentView、findViewById()等。由PhoneWindow来实现。
=================================================================================
-
WindowManager继承自ViewManager这个接口,这个接口主要有以下的实现子接口:
addView()、updateViewLayout()、removeView();
WindowManager可以添加view到屏幕,也可以从屏幕删除view。它面向的对象一端是屏幕,另一端就是View,通过WindowManager的 addView方法创建View,这样产生出来的View根据WindowManager.LayoutParams属性不同,效果也就不同了,比如创建系统顶级窗口,实现悬浮窗口效果。
-
我们每次创建一个Activity的时候,同样也是要添加当前Activity的View到窗口上,这个View是DecorView,同样也是通过调用addview()方法来实现。具体在ActivityRecord.java里面的handleResumeActivity来实现的。