在Android中,Touch事件的分发分服务端和应用端。在服务端由WindowManagerService(借助InputManagerService)负责采集和分发的,在应用端则是由ViewRootImpl(内部有一个mView变量指向View树的根,负责控制View树的UI绘制和事件消息的分发)负责分发的。
当输入设备可用时,比如触屏,Linux内核会在/dev/input中创建对应的设备节点。
IMS(InputManagerService)所做的工作就是监听/dev/input下的所有的设备节点,当设备节点有数据时会将数据进行加工处理并找到合适的Window(WMS寻找),将输入事件派发给他。
- 事件信号是物理文件存储数据,位置:dev/input
- linux 有提供相关的文件监控api:inotify 、 epoll( ①inotify能监控文件变化产生FD ②epoll可以监控FD,以此配合完成文件的监控与监听)
- android 他写了两个线程来处理dev/input下面的信号
- 专门写了一个EventHub对象,里面用inotify+epoll对dev/input下进行监控!
- 将该对象放到InputReaderThread当中去执行,轮训getEvent(),这个里面有epoll_wait,相当于wait-notify机制,唤醒的触发点是/dev/input下的文件被改变,这个文件由驱动去推送数据
- InputReaderThread当中将/dev/input下的数据提取,封装,然后交给InputDispathcerThread
- InputDispathcerThread给最终选择到对应的ViewRootImpl(Window)
- 中间的通信机制通过socketpair进行,两边一人一组socketpair然后在ViewRootImpl中对于Channel的连接的文件进行监控,最终上层接受到touch信号。