1. 回顧
我們知道Android輸入系統(tǒng)是Reader線程通過驅動程序得到上報的輸入事件,還要經(jīng)過處理,才可以將輸入事件發(fā)送給應用程序,現(xiàn)在回顧一下是具體做哪些處理。
首先Reader線程會將輸入事件放入mInboundQueue隊列當中,但是放入隊列之前需要進行稍加處理。
1.1 處理類型
- 緊急事件,馬上處理(來電振鈴時,按下音量鍵,會馬上靜音)
- 對輸入事件添加Flag,決定輸入事件是否傳給用戶Dispatch線程從mInboundQueue中取出事件,稍加處理之后,查找到目標的應用程序后,便會放入某個應用程序的輸出隊列(mOutBoundQueue)
從輸出隊列中將事件取出,發(fā)送給應用程序
2. Dispatch前處理總體分析
2.1 命令隊列為空時時候
從mIboundQueue取出事件
用它來生成一個命令,放入命令隊列或者直接丟棄(對于!Pass_To_User的事件)
對于經(jīng)過處理的事件,dispatch它
對于Global Key丟棄
System Key 丟棄
User Key 找到target,dispatch
InputDispatch.cpp
if (!haveCommandsLocked()) { dispatchOnceInnerLocked(&nextWakeupTime); }
2.2 命令隊列有數(shù)據(jù),執(zhí)行命令
Global Key 發(fā)廣播
System Key 直接處理
User Key 不做處理
InputDispatch.cpp
if (runCommandsLockedInterruptible()) { nextWakeupTime = LONG_LONG_MIN; }