Android 窗口管理 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中。

• [email protected]
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将事件派发到客户端的?

更多相关文章

  1. 《Android权威编程指南》挑战练习:定制 toast 消息
  2. Android 绑定数据到界面控件
  3. [android深入学习]android窗口管理机制
  4. Android控件显示和隐藏
  5. iphone开发之常用控件的使用详解
  6. Android初级-Android 日志输出和Debug跟踪,常用控件(中),资源

随机推荐

  1. 静态h5页面没有后台直接访问本地json文件
  2. chrome的timeline中stalled问题解析
  3. ajax cache false无法加载图片
  4. 获取复选框的文本属性
  5. 在上传前预览xls、xlsx、doc等文件的缩略
  6. jQuery.parseJSON()函数详解
  7. Slick:TypeError:b。$ slides为null
  8. 页面加载后的JQuery(窗口).load?
  9. jQuery Ajax不适用于每个版本的Internet
  10. 在jQuery中使用部分ID查找元素?(复制)