7.2 Android的窗口机制

通过上一节的介绍,我们了解了交互事件在控件树中的传递和处理。本节将会介绍如何将用户的操作变成交互事件传递到交互界面上,这就是Android的窗口机制。

7.2.1 窗口机制的基本原理

Android的窗口机制,是为了将用户与界面的交互传递到对应的控件中去,之所以称为窗口机制,是因为它采取了基于窗口(Window)注册的实现模式。

窗口机制的核心是窗口管理服务(实现类是WindowManagerService),它是Android系统的核心服务之一,运行在系统核心进程的一个独立线程中。它负责管理所有交互界面的控件树,并将用户操作转换成交互事件传递至当前交互界面。

每棵控件树都有一个对应的ViewParent接口对象,该接口的实现类是android.view.ViewRoot类。如图7-5所示,在应用的一端,所有的ViewRoot对象都由android.view.WindowManager对象来管理。开发者可以通过调用Context.getSystemService函数传入Context.WINDOW_SERVICE来获得该对象:


WindowManager manager=(WindowManager)

getSystemService(Context.WINDOW_SERVICE);


通过WindowManager对象,Android会将各个ViewRoot对象与窗口管理服务建立双向的通信信道,使得ViewRoot对象和窗口管理服务可以对彼此进行远程函数的调用。每个ViewRoot对象所对应的控件树,都会有其控制的矩形区域(也就是根控件的矩形区域),该区域便是该对象的“窗口区域”。

如图7-5所示,ViewRoot对象会通过WindowManager向窗口管理服务发送注册请求,窗口管理服务会为该ViewRoot构建起一个双向通信的连接。当用户通过硬件设备(比如键盘、屏幕、重力感应器等)与应用进行交互时,系统底层的驱动会将这个操作传递到窗口管理服务当中,窗口管理服务会解析这次操作,并将其转化成交互事件。紧接着,窗口管理服务会尝试定位当前与用户进行交互的窗口,然后将请求发送给该窗口的ViewRoot对象。ViewRoot对象接到交互事件后,会沿着控件树从下向上进行传递。

窗口管理服务会为每个可视的窗口分配一个窗口层次(Z-order)。当用户与设备产生交互时(比如:触摸屏幕),窗口管理服务会寻找与该窗口区域相关联的窗口,然后将事件传递给层次最高的窗口。在窗口管理服务中,越晚添加的窗口通常具有越高的窗口层次,更易于接收交互消息。除此之外,一些系统交互模块,比如状态栏、通知栏等,则具有更高的基础窗口层次,它们可以优先于普通的应用窗口来处理用户的交互事件。

7.2 Android的窗口机制 - 图1

图 7-5 窗口管理服务的实现