Android?Framework層獲取及處理按鍵事件流程
前言
Android系統(tǒng)的輸入事件是由InputManagerService服務(wù)來監(jiān)控的,該系統(tǒng)服務(wù)在SystemServer的startOtherServices()中初始化。初始化的過程中會(huì)在Native層創(chuàng)建InputReaderThread和InputDispatcherThread兩個(gè)線程,InputReaderThread的主要工作是讀取輸入事件,然后將輸入事件傳遞給InputDispatcherThread,最后由InputDispatcher將輸入事件分發(fā)到應(yīng)用層。從源碼的角度來看,InputReaderThread線程中,會(huì)循環(huán)執(zhí)行threadLoop()方法,該方法又會(huì)調(diào)用InputReader的loopOnce()方法,而loopOnce()方法則主要做了三件事,可描述為圖所示的流程:

- 通過
EventHub的getEvents()方法獲取輸入事件; - 調(diào)用
processEventsLocked()方法來處理輸入事件; - 通過
mQueuedListener的flush()方法將輸入事件發(fā)送到InputDispatcher。
下面分別介紹這幾個(gè)過程。
一、EventHub的getEvents()
該方法實(shí)現(xiàn)邏輯可簡(jiǎn)述成圖所示的流程:

如果是第一次調(diào)用該方法的話,則需要先掃描/dev/input目錄下的輸入設(shè)備;接著用mPendingEventItems保存待處理的輸入事件;隨后判斷是否有輸入事件需要處理,有則立即返回;否則通過epoll_wait等待輸入事件到來。
二、InputReader的processEventsLocked()
當(dāng)獲取到輸入事件之后,就會(huì)調(diào)用processEventsLocked()方法來處理:

對(duì)輸入事件的處理是由processEventsForDeviceLocked()方法來完成的,以按鍵事件為例,下圖是處理過程的時(shí)序圖。

- 在processEventsForDeviceLocked()方法里,首先獲取設(shè)備索引,然后根據(jù)設(shè)備索引獲取設(shè)備,最后調(diào)用InputDevice的process()方法來處理。
- 在process()方法里,遍歷處理所有輸入事件,并循環(huán)調(diào)用所有mapper來處理每一個(gè)輸入事件。按鍵事件中,KeyboardInputMapper的process()方法首先會(huì)判斷掃描碼是不是鍵盤碼,如果是,就調(diào)用processKey()方法處理。
- 在processKey()方法中,首先根據(jù)掃描碼獲取到對(duì)應(yīng)的keyCode方法,然后構(gòu)建NotifyKeyArgs對(duì)象,最后調(diào)用QueuedInputListener的notifyKey()方法通知key事件。notifyKey()方法首先按對(duì)鍵事件進(jìn)行檢查、驗(yàn)證;其次處理特殊按鍵;然后把按鍵放到InboundQueue隊(duì)列,最后調(diào)用Looper的wake方法向管道中寫入字符,喚醒InputDispatcherThread。
到此這篇關(guān)于Android Framework層獲取及處理按鍵事件流程的文章就介紹到這了,更多相關(guān)Android Framework 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決Android Studio 代碼無提示無顏色區(qū)分問題
這篇文章主要介紹了解決Android Studio 代碼無提示無顏色區(qū)分問題,需要的朋友可以參考下2018-08-08
Android實(shí)現(xiàn)歌詞漸變色和進(jìn)度的效果
這篇文章主要介紹了Android實(shí)現(xiàn)歌詞漸變色和進(jìn)度的效果的相關(guān)資料,需要的朋友可以參考下2016-03-03
Android中TextView文本高亮和點(diǎn)擊行為的封裝方法
這篇文章主要介紹了Android中TextView文本高亮和點(diǎn)擊行為的封裝方法,文中介紹的非常詳細(xì),相信對(duì)大家具有一定的參考價(jià)值,需要的朋友們下面來一起看看吧。2017-03-03
Android底部菜單欄(RadioGroup+Fragment)美化
這篇文章主要介紹了Android底部菜單欄RadioGroup+Fragment美化,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-07-07
Android應(yīng)用開發(fā)中Fragment間通信的實(shí)現(xiàn)教程
這篇文章主要介紹了Android應(yīng)用開發(fā)中Fragment間通信的實(shí)現(xiàn)教程,包括接口的定義實(shí)現(xiàn)與Fragment通信的動(dòng)靜態(tài)加載等,需要的朋友可以參考下2016-02-02
Android實(shí)現(xiàn)動(dòng)態(tài)高斯模糊效果示例代碼
這篇文章主要介紹了Android快速實(shí)現(xiàn)動(dòng)態(tài)模糊效果示例代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-01-01
Android利用ContentProvider獲取聯(lián)系人信息
這篇文章主要為大家詳細(xì)介紹了Android利用ContentProvider獲取聯(lián)系人信息,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11
Android實(shí)現(xiàn)長(zhǎng)按圓環(huán)動(dòng)畫View效果的思路代碼
這篇文章主要介紹了Android實(shí)現(xiàn)長(zhǎng)按圓環(huán)動(dòng)畫View效果,本文給大家分享實(shí)現(xiàn)思路,通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09
Android動(dòng)畫 實(shí)現(xiàn)開關(guān)按鈕動(dòng)畫(屬性動(dòng)畫之平移動(dòng)畫)實(shí)例代碼
這篇文章主要介紹了Android動(dòng)畫 實(shí)現(xiàn)開關(guān)按鈕動(dòng)畫(屬性動(dòng)畫之平移動(dòng)畫)實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2016-11-11

