Android?Framework層獲取及處理按鍵事件流程
前言
Android
系統(tǒng)的輸入事件是由InputManagerService
服務(wù)來監(jiān)控的,該系統(tǒng)服務(wù)在SystemServer
的startOtherServices()
中初始化。初始化的過程中會在Native
層創(chuàng)建InputReaderThread
和InputDispatcherThread
兩個線程,InputReaderThread
的主要工作是讀取輸入事件,然后將輸入事件傳遞給InputDispatcherThread
,最后由InputDispatcher
將輸入事件分發(fā)到應(yīng)用層。從源碼的角度來看,InputReaderThread
線程中,會循環(huán)執(zhí)行threadLoop()
方法,該方法又會調(diào)用InputReader的loopOnce()
方法,而loopOnce()
方法則主要做了三件事,可描述為圖所示的流程:
- 通過
EventHub的getEvents()
方法獲取輸入事件; - 調(diào)用
processEventsLocked()
方法來處理輸入事件; - 通過
mQueuedListener
的flush()
方法將輸入事件發(fā)送到InputDispatcher
。
下面分別介紹這幾個過程。
一、EventHub的getEvents()
該方法實現(xiàn)邏輯可簡述成圖所示的流程:
如果是第一次調(diào)用該方法的話,則需要先掃描/dev/input目錄下的輸入設(shè)備;接著用mPendingEventItems保存待處理的輸入事件;隨后判斷是否有輸入事件需要處理,有則立即返回;否則通過epoll_wait等待輸入事件到來。
二、InputReader的processEventsLocked()
當(dāng)獲取到輸入事件之后,就會調(diào)用processEventsLocked()方法來處理:
對輸入事件的處理是由processEventsForDeviceLocked()方法來完成的,以按鍵事件為例,下圖是處理過程的時序圖。
- 在processEventsForDeviceLocked()方法里,首先獲取設(shè)備索引,然后根據(jù)設(shè)備索引獲取設(shè)備,最后調(diào)用InputDevice的process()方法來處理。
- 在process()方法里,遍歷處理所有輸入事件,并循環(huán)調(diào)用所有mapper來處理每一個輸入事件。按鍵事件中,KeyboardInputMapper的process()方法首先會判斷掃描碼是不是鍵盤碼,如果是,就調(diào)用processKey()方法處理。
- 在processKey()方法中,首先根據(jù)掃描碼獲取到對應(yīng)的keyCode方法,然后構(gòu)建NotifyKeyArgs對象,最后調(diào)用QueuedInputListener的notifyKey()方法通知key事件。notifyKey()方法首先按對鍵事件進行檢查、驗證;其次處理特殊按鍵;然后把按鍵放到InboundQueue隊列,最后調(diào)用Looper的wake方法向管道中寫入字符,喚醒InputDispatcherThread。
到此這篇關(guān)于Android Framework層獲取及處理按鍵事件流程的文章就介紹到這了,更多相關(guān)Android Framework 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決Android Studio 代碼無提示無顏色區(qū)分問題
這篇文章主要介紹了解決Android Studio 代碼無提示無顏色區(qū)分問題,需要的朋友可以參考下2018-08-08Android中TextView文本高亮和點擊行為的封裝方法
這篇文章主要介紹了Android中TextView文本高亮和點擊行為的封裝方法,文中介紹的非常詳細,相信對大家具有一定的參考價值,需要的朋友們下面來一起看看吧。2017-03-03Android底部菜單欄(RadioGroup+Fragment)美化
這篇文章主要介紹了Android底部菜單欄RadioGroup+Fragment美化,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-07-07Android應(yīng)用開發(fā)中Fragment間通信的實現(xiàn)教程
這篇文章主要介紹了Android應(yīng)用開發(fā)中Fragment間通信的實現(xiàn)教程,包括接口的定義實現(xiàn)與Fragment通信的動靜態(tài)加載等,需要的朋友可以參考下2016-02-02Android實現(xiàn)動態(tài)高斯模糊效果示例代碼
這篇文章主要介紹了Android快速實現(xiàn)動態(tài)模糊效果示例代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下。2017-01-01Android利用ContentProvider獲取聯(lián)系人信息
這篇文章主要為大家詳細介紹了Android利用ContentProvider獲取聯(lián)系人信息,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-11-11Android實現(xiàn)長按圓環(huán)動畫View效果的思路代碼
這篇文章主要介紹了Android實現(xiàn)長按圓環(huán)動畫View效果,本文給大家分享實現(xiàn)思路,通過示例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-09-09Android動畫 實現(xiàn)開關(guān)按鈕動畫(屬性動畫之平移動畫)實例代碼
這篇文章主要介紹了Android動畫 實現(xiàn)開關(guān)按鈕動畫(屬性動畫之平移動畫)實例代碼的相關(guān)資料,需要的朋友可以參考下2016-11-11