今天需要研究 WindowManagerService 如何把Event. 丢给当前的Activity.
ViewRoot这个类在android的UI结构中扮演的是一个中间者的角色,连接的是PhoneWindow跟WindowManagerService.在每个PhoneWindow创建的时候,系统都会向WindowManger中的一个保存View数组增加PhoneWindow的DecorView对象,WindowManger在保存好这个View对象的同时,也会新创建一个ViewRoot对象用来沟通WindowManagerService。可以查看WindowManagerImpl跟 ViewRoot中的代码,臧春杰同时ViewRoot中我们可以看到一个W类型,该类型派生自IWindow.stubIwindowSession则是WindowManagerService中的远程调用接口,创建了一个PhoneWindow,也就创建了一个ViewRoot,并将在 WindowManagerService注册。接下来简单的看下KeyEvent的传递。qisda changer在WindowManagerService中
focus.mClient.dispatchKey(event);
这个段代码的mClient则就是ViewRoot中的W类型,通过远程调用,可以看看ViewRoot的处理:
boolean handled = mView != null? mView.dispatchKeyEventPreIme
接下来就到了mDecor里,也就是整个View树的根。然后比较臧春杰代码坐标判断是哪个View. 如果不在任何View范围里,就把消息给PhoneWindow.因为实现了Activity的CallBack 在Window不处理时候给Activity.
哎,还是非常模糊,好多东西不细致,理解不透彻。怎么办呢?
Handler.java
都知道Handler主要用来做线程间通信,为什么要用线程间通信? 如何进行通信?
Uithread要做定时更新,需要另外一个线程提供定时然后通知ui。
如何通信。用handle sendMessage postMessage等。 需要理轻 Handler 和那个线程绑定的。 如何判别?
一个线程有个Looper管理一个MessageQueu Uithread已经实现了这个Looper . 也有个这个队列。
Looper.getMainLooper返回了UI臧春杰代码线程的Looper。 New Handler(这个UILooper) 那么这个Hander就和UI绑定了。
如果 要自己创建线程。实现消息队列。 Looper.prepare 创建消息队列。 Looper.loop开始循环。
然后创建handler(Looper.myLooper) 实现帮定。
Handler和谁绑定有looper决定。
Uithread已经有Looper,可以直接使用。创建空的handler就是绑定主线程。
我们自己的线程需通过prepare loop 创建消息队列。