1. 回顾
我们知道Android输入系统是Reader线程通过驱动程序得到上报的输入事件,还要经过处理,才可以将输入事件发送给应用程序,现在回顾一下是具体做哪些处理。
首先Reader线程会将输入事件放入mInboundQueue队列当中,但是放入队列之前需要进行稍加处理。
1.1 处理类型
- 紧急事件,马上处理(来电振铃时,按下音量键,会马上静音)
- 对输入事件添加Flag,决定输入事件是否传给用户Dispatch线程从mInboundQueue中取出事件,稍加处理之后,查找到目标的应用程序后,便会放入某个应用程序的输出队列(mOutBoundQueue)
从输出队列中将事件取出,发送给应用程序
2. Dispatch前处理总体分析
2.1 命令队列为空时时候
从mIboundQueue取出事件
用它来生成一个命令,放入命令队列或者直接丢弃(对于!Pass_To_User的事件)
对于经过处理的事件,dispatch它
对于Global Key丢弃
System Key 丢弃
User Key 找到target,dispatch
InputDispatch.cpp
if (!haveCommandsLocked()) { dispatchOnceInnerLocked(&nextWakeupTime); }
2.2 命令队列有数据,执行命令
Global Key 发广播
System Key 直接处理
User Key 不做处理
InputDispatch.cpp
if (runCommandsLockedInterruptible()) { nextWakeupTime = LONG_LONG_MIN; }