对于像我这样刚入门的android程序员,如果想大致弄清楚触摸屏事件传到用户界面的过程,我觉得需要弄清楚以下几个部分:
一 Activity, Window,View之间的关系
二 Window,WindowManager,WindowManagerServer的创建和消息传递的基本规则
三 本地类 InputReader , InputDispatcher 的创建,对触摸屏事件的读取和派发
四 触摸屏事件从InputDispatcher怎么传递到Window
五 触摸屏事件在ViewGroup/view中的传递
为了看懂相关代码,还有两个android比较重要的框架的实现:JNI 和 Binder。 这两种功能,我个人觉得,不必要很精通,能知道从哪里找到调用的方法即可。
首先,把各种涉及到的重要的接口名/类名列出来,混个脸熟。
Activity
Window
PhoneWindow
DecorView
ViewRoot ( android4.0 中为 ViewRootImpl )
WindowManager
WindowManagerImpl
LocalWindowManager
WindowManagerServer
InputManager
InputReader
InputDispatcher
接下来,一起看看各个部分。
Activity , 只要写过Android程序的人都知道,android的四大金刚之一。Activity是应用程序的载体。它并不参与界面的显示,界面的显示都交给Window来管理。
PhoneWindow是从Window派生来的,Window是一个抽象类。每个Activity中有且只有一个PhoneWindow。(至于PhoneWindow的作用,这里我暂时还无法很准确地归纳,希望有牛人赐教)
DecorView,DecorView是一个扩展的FrameLayout的类,是窗口中所有View的根View。
ViewRoot, 每个Window都会对应一个ViewRoot对象。ViewRoot从Handle派生过来,处理各种其它模块发送的事件。比如触摸屏事件就是从其它模块发送到ViewRoot后,由ViewRoot的handleMessage()方法处理的。
(未完待续,本人初学,如果有问题,敬请指出,一起讨论)