Android 窗口管理
在整个控件树的最顶端,是一个逻辑的树顶,ViewParent,在源码中的实现是ViewRoot(ViewRoot extends Handler implements ViewParent)。它是整个控件树和WindowManager之间的事件信息的翻译者。WindowManager是Android中一个重要的服务。它将用户的操作,翻译成为指令,发送给呈现在界面上的各个Window。Activity会将顶级的控件注册到WindowManager中,当用户真是触碰屏幕或键盘的时候,WindowManager就会通知到,而当控件有一些请求产生,也会经由ViewParent送回到WindowManager中。从而完成整个通信流程。
事件分发流程
用户在触发一个时间后产生一个消息,消息先被window manager采集到,然后分发给client。
window manager通过IWindow分发给client,我们知道ViewRoot使用IWindowSession与server通讯,使用IWindow接收消息,所以第一步消息到了ViewRoot这里来了
也就是window manager->IWindow->ViewRoot
到了ViewRoot后它把消息转发给Looper(楼主可以看ViewRoot.java看它是怎么获取当前线程的Looper的)
Looper->ViewRoot$RootHandler().dispatch(),有转发会给ViewRoot,然后就通过decor view形成的树状结构依次分发下去。
window manager proxy中维护了view, ViewRoot, layout param三元组。
每次调用window manager proxy的addView都会新增一个三元组。一般程序中都是调用addView(decor,...),也就是只对decor view调用addView
*****************\
在Activity在performLaunchActivity时,会使用Activity.attach()建立一个PhoneWindow主窗口。这个主窗口的建立并不是一个重点。handleResumeActivity真正要启动一个Activity时候,将主窗口加入到WindowManager,当然并不是将主窗口本身,而是将主窗口的DecorView加入到WindowManager中。
• performLaunchActivity@ActivityThread.java
attach()@Activity.javaSession.java
addWindow()@WindowManager
mWindow = PolicyManager.makeNewWindow(this); --实例化一个activity或者dialog或者widget的地方才会make new window
• handleResumeActivity()@ActivityThread.java
addView()@WindowManagerImpl.java --添加DecorView到WindowManager中
setView()@ViewRoot.java
add()@IwindowSession.java
| --这里通过AIDL调用
add()@WindowManagerService$Service.java
关于PhoneWindow:
而PhoneWindow只是做了一个具体跟手机功能相关的公用事件的处理,所以在Android中PhoneWindow并不是一个抽象的纯正概念,而是一个跟手机系统相关的一个特别窗口概念,例如按键的默认动作处理,按键音的发出等等。
一个View对应一个ViewRoot
问题:WindowMangerService如果通过AIDL将事件派发到客户端的?