1. 回顧

我們知道Android輸入系統(tǒng)是Reader線程通過(guò)驅(qū)動(dòng)程序得到上報(bào)的輸入事件,還要經(jīng)過(guò)處理,才可以將輸入事件發(fā)送給應(yīng)用程序,現(xiàn)在回顧一下是具體做哪些處理。

  1. 首先Reader線程會(huì)將輸入事件放入mInboundQueue隊(duì)列當(dāng)中,但是放入隊(duì)列之前需要進(jìn)行稍加處理。
    1.1 處理類型
    - 緊急事件,馬上處理(來(lái)電振鈴時(shí),按下音量鍵,會(huì)馬上靜音)
    - 對(duì)輸入事件添加Flag,決定輸入事件是否傳給用戶

  2. Dispatch線程從mInboundQueue中取出事件,稍加處理之后,查找到目標(biāo)的應(yīng)用程序后,便會(huì)放入某個(gè)應(yīng)用程序的輸出隊(duì)列(mOutBoundQueue)

  3. 從輸出隊(duì)列中將事件取出,發(fā)送給應(yīng)用程序

2. Dispatch前處理總體分析

2.1 命令隊(duì)列為空時(shí)時(shí)候
  • 從mIboundQueue取出事件

  • 用它來(lái)生成一個(gè)命令,放入命令隊(duì)列或者直接丟棄(對(duì)于!Pass_To_User的事件)

  • 對(duì)于經(jīng)過(guò)處理的事件,dispatch它

    • 對(duì)于Global Key丟棄

    • System Key 丟棄

    • User Key 找到target,dispatch

InputDispatch.cpp
if (!haveCommandsLocked()) {
    dispatchOnceInnerLocked(&nextWakeupTime);
}
2.2 命令隊(duì)列有數(shù)據(jù),執(zhí)行命令
  • Global Key 發(fā)廣播

  • System Key 直接處理

  • User Key 不做處理

InputDispatch.cpp
if (runCommandsLockedInterruptible()) {
    nextWakeupTime = LONG_LONG_MIN;
}

3. dispatch前處理情景分析

3.1 !Pass_To_User