1. 回顾

我们知道Android输入系统是Reader线程通过驱动程序得到上报的输入事件,还要经过处理,才可以将输入事件发送给应用程序,现在回顾一下是具体做哪些处理。

  1. 首先Reader线程会将输入事件放入mInboundQueue队列当中,但是放入队列之前需要进行稍加处理。
    1.1 处理类型
    - 紧急事件,马上处理(来电振铃时,按下音量键,会马上静音)
    - 对输入事件添加Flag,决定输入事件是否传给用户

  2. Dispatch线程从mInboundQueue中取出事件,稍加处理之后,查找到目标的应用程序后,便会放入某个应用程序的输出队列(mOutBoundQueue)

  3. 从输出队列中将事件取出,发送给应用程序

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;
}

3. dispatch前处理情景分析

3.1 !Pass_To_User