一. 参考
-
Android触摸事件全过程分析:由产生到Activity.dispatchTouchEvent()
https://juejin.cn/post/6844903779435970573
-
Input系统—启动篇
http://gityuan.com/2016/12/10/input-manager/ -
【带着问题学】android事件分发8连问
https://juejin.cn/post/6965484155660402702
二. 理解
-
触摸屏幕后,事件如何传递给Android系统?
触摸屏幕后,屏幕硬件产生中断, CPU响应中断,调用屏幕驱动程序进行处理.
驱动程序处理后将事件写入输入设备节点文件dev/input/event[x] 中.总结:硬件驱动程序完成了触摸事件的数据收集
-
Android系统进程(System Server)对触摸事件的处理?
(1)系统启动时System Server 进程中会启动一系列的系统服务,其中 InputManagerService 负责对输入事件的管理.
(2)InputManagerService 内部有一个InputReader线程负责从dev/input/event[x]中读取事件, 后加入到InputDispatch线程的队列里,由其通过InputChannel进行分发. -
系统进程(System Server) 如何将事件传递给App应用进程?
(1) InputChannel是一个用于跨进程通信的soket.
(2) WindowManagerService 针对一个Window, 创建了InputChannel的SocketPair, 其中将服务端注册到InputDispatch中;将客户端关联到应用进程中. -
App应用进程对触摸事件的处理?
(1) 应用进程监控发送到InputChannel的客户端的事件
(//将socket客户端的fd添加到主线程的消息池,
//通过epoll监听fd)
, 调用InputEventReceiver.dispachInputEvent进行处理
(2) 事件回传到ViewRootImpl中, 然后进行一系列的InputStage处理事件,
经层层回调会走到mView.dispatchPointerEvent; 这里的mView 即DecorView
(3) DecorView 将事件回调到Activity; 然后Activity又回调到PhoneWindow;
最后PhoneWindow又回调事件给DecorView.
(4) 最后事件沿着View树,进行dispatchEvent 一层层的派发和消费.
总体流程图: