现在的位置: 首页 > 综合 > 正文

Android GWES 窗口系统

2017年12月24日 ⁄ 综合 ⁄ 共 3062字 ⁄ 字号 评论关闭

1.基本构架原理

Android 的窗口管理是C/S 模式的。主View 被加入到WindowManager 中,WM 使用WindowState 与这个主View 对应。

Client 通过WindowSession 将window 加入到WindowManager 中。一个完整的窗口概念横跨了View,ViewRoot,WindowManager Service。

Client端的Activity 通过Session 会话与WindowManager建立对话,而WindowManager 则通过IWindow 接口访问Client,将消息传递到Client 端,通过消息分发渠道,将消息传递到处理函数OnXXX。

2 .Client 端

2.1 View

在Activity 中真正重要的概念是View,以下是Google 官方对View 的定义:

This class represents the basic buildingblock for user interface components. A View occupies a

rectangular area on the screen and isresponsible for drawing and event handling. View is the baseclass for widget,which are used to create interactive UI components (buttons, text

fields, etc.). The ViewGroup subclass isthe base class for layouts, which are invisible containers that hold otherViews (or other ViewGroups)and define their layout properties.

客户端的组成:

在Activity 在performLaunchActivity 时,会使用Activity.attach()建立一个PhoneWindow主窗口。handleResumeActivity 真正要启动一个Activity

时候,将PhoneWindow主窗口加入到WindowManager,当然并不是将主窗口本身,而是将主窗口的DecorView 加入到WindowManager 中。真正Window 核心的抽象概念存在于View, ViewRoot , WindowManger 中的WindowState。主View 就是Top-Level View of the window. 主View 与View 想对,突出主View 是attatch 到主窗口上的。而一般的View则是存在于主View 中的。

View,GroupView,DecorView,ViewRoot 都是存在于Client 端,只有WindowState 这个概念存在于Window Manager Service 端。

DecorView 实际上是一个ViewGroup。DecorView 是Top-LevelView.View ,View 的成员变量mParent 用来管理View 上级关系的。ViewGroup 构建了焦点管理和子View节点数组。通过View 的mParent 和ViewGroup 的mChildren 构建了Android 中View 直接的关系网。

2.2 Focus Path

Foucs Path 是KeyEvent 传递的路线。KeyEvent在主循环中主View 通过View 的焦点记录关系传递到焦点View 上。例如下图,View22 是焦点,我们从最顶层的View 通过mFcous 的关系链找到最后所形成的路径就是Focus Path。

2.3 ViewRoot,Window Manager Proxy

ViewRoot 与Window Manager 的核心是IWindowSession和IWindow 。ViewRoot 通过

IWindowSession 添加窗口到WindowManager。而IWindow 是Window Manager 分发消息给Client ViewRoot 的渠道。利用AIDL 接口进行进程间通信。

ViewRoot 建立主View 与WindowsManger通讯的桥梁。ViewRoot 在本质上是一个Handler. Handler 的基本功能是处理回调,发送消息。

Activity 使用getSystemService 获取WindowManagerImpl, 建立了一个

WindowManagerImpl 实例,即WindowManager 服务的代理:

wm=(WindowManagerImpl)context.getSystemService(Context.WINDOW_SERVICE);并调用

wm.addview 添加窗口到WMService 中。

在Window Manager Proxy中建立了View,Layout ,ViewRoot 三者的对应关系表。构造一个ViewRoot 就会打开一个session,并利用IWindowSession 建立会话上下文。

 

4 Window Manager Service

Window Manager 管理的窗口是应用程序的Top-level窗口,

主窗口为什么要放在在Service 这边来管理呢?为什么不放在Client 那边?主窗口放

置在一起管理是为了计算Z-order 序列,根据应用程序的状态来显隐应用程序的窗口。Android 设计者在考虑设计窗口系统的时候,首先考虑:

窗口z-order 序的管理

活动窗口的计算,及其变化通知

窗口归属(属于哪个应用)

输入法管理

Window Service 大体上实现了如下的功能:,

(1)Z-ordered 的维护函数

(2)输入法管理

(3)AddWindow/RemoveWindow

(4)Layerout

(5)Token 管理,AppToken

(6)活动窗口管理(FocusWindow)

(7)活动应用管理(FocusAPP)

(8)转场动画

(9)系统消息收集线程

(11)系统消息分发线程

在服务端的窗口对象叫做WindowState。WindowState 有一个叫做mClient 成员变量来记录客户端IWindow 实例,IWindow 是Service 连接View 桥梁。在Service 维护了一个mWindow 数组,这个mWindow就是Window 的Z-order 序数组。mWindowMap 用于记录<Client:Binder,WindowState 对象>。

(1) FocusWindow 活动窗口如何计算?

基本原理就是查找(FousActivity),并同Z-Order 序中找出属于该FousActivity(AppToken)的主窗口,这个窗口就是计算出来的Focus Window。

(2)为什么要提出Token 这个概念呢?

如何来标识该窗口是属于某个Activity,Andoid 设计者提出了AppToken 这个概念。AppToken 在本质上的描述:<Token:IBinder,allWindows>,通过Token 找到属于该Token 的allWindows。使用Token 完成该应用程序的所有窗口的显示和隐藏。

(3)系统消息收集与处理

service的系统消息收集模式及其分发模式。service用keyq作为专门的消息队列。

系统有两个线程:KeyQ 线程,通过Navite 函数readEvent 轮询设备,将读取的结果放置KeyQ 队列中。系统dispatcher 等待在KeyQ 消息队列上,一旦从消息队列中获取到消息,就通过分发函数通过mClient 传递到Client 端。

 

抱歉!评论已关闭.