1. 回顾
-
InputRead线程从输入设备当中得到输入事件
-
对于读到输入事件稍作处理,比如紧急事件,来电时候按下音量键便是静音,这时候是直接处理的,处理之后再把输入事件放入mInBoundQueue队列当中,接着唤醒Dispatch线程。
-
对于Dispatch线程也是对输入事件稍作处理之后,再给分发给应用程序
- Global Key/System Key:处理之后直接丢掉
- User Key:上传给应用程序:通过查找目标APP得到对应connection,再把输入事件放入某个outBoundQueue队列中,应用程序将其取出处理。
2. 分发dispatch事件概述
在上一篇博文分析到在Dispatch线程当中有一个Vector容器(mConnectionByFd),里面有多个connection,这些connection对应着一个个应用程序connection含有InputChannel(含有fd),应用程序也含有对应fd,fd通过socketpair机制得到。Dispatch线程找到对应的connection之后,便可以将输入事件写入InputChannel中的fd中,应用程序通过socketpair机制马上便可以获得fd。
3. 分发Dispatch过程
-
查找目标
- 向WindowManagerService查询当前窗口
- 获得对应的connection
-
把输入事件放入connection某个队列outBoundQueue中
-
从队列中取出,构造为InputMessage类型,逐个将输入事件写入fd中