1. 回顧
我們知道Android輸入系統(tǒng)是Reader線程通過驅(qū)動(dòng)程序得到上報(bào)的輸入事件,還要經(jīng)過處理,才可以將輸入事件發(fā)送給應(yīng)用程序,現(xiàn)在回顧一下是具體做哪些處理。
首先Reader線程會(huì)將輸入事件放入mInboundQueue隊(duì)列當(dāng)中,但是放入隊(duì)列之前需要進(jìn)行稍加處理。
1.1 處理類型
- 緊急事件,馬上處理(來電振鈴時(shí),按下音量鍵,會(huì)馬上靜音)
- 對(duì)輸入事件添加Flag,決定輸入事件是否傳給用戶Dispatch線程從mInboundQueue中取出事件,稍加處理之后,查找到目標(biāo)的應(yīng)用程序后,便會(huì)放入某個(gè)應(yīng)用程序的輸出隊(duì)列(mOutBoundQueue)
從輸出隊(duì)列中將事件取出,發(fā)送給應(yīng)用程序
2. Dispatch前處理總體分析
2.1 命令隊(duì)列為空時(shí)時(shí)候
從mIboundQueue取出事件
用它來生成一個(gè)命令,放入命令隊(duì)列或者直接丟棄(對(duì)于!Pass_To_User的事件)
對(duì)于經(jīng)過處理的事件,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; }