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()方法首先按對鍵事件進(jìn)行檢查、驗證;其次處理特殊按鍵;然后把按鍵放到InboundQueue隊列,最后調(diào)用Looper的wake方法向管道中寫入字符,喚醒InputDispatcherThread。
到此這篇關(guān)于Android Framework層獲取及處理按鍵事件流程的文章就介紹到這了,更多相關(guān)Android Framework 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android實現(xiàn)讓圖片在屏幕上任意移動的方法(拖拽功能)
這篇文章主要介紹了Android實現(xiàn)讓圖片在屏幕上任意移動的方法,實例分析了Android拖拽功能的相關(guān)實現(xiàn)技巧,需要的朋友可以參考下2016-08-08
Android編程實現(xiàn)ListView內(nèi)容無限循環(huán)顯示的方法
這篇文章主要介紹了Android編程實現(xiàn)ListView內(nèi)容無限循環(huán)顯示的方法,通過繼承Adapter類實現(xiàn)ListView中的數(shù)據(jù)無限循環(huán)顯示功能,需要的朋友可以參考下2017-06-06
ListView的Adapter使用 之 初學(xué)ArrayAdapter String
ListView是Android中經(jīng)常會使用的東西,綁定數(shù)據(jù)對于初學(xué)者來說,尤其是剛接觸編程的人來說,往往會覺得很難理解,我上大二的時候?qū)W的java,但是基本上相當(dāng)于沒有學(xué),什么都沒寫過,真正接觸編程就是開始上手學(xué)android,把這些記錄下來,自己可以回頭看下,也可以讓新手更好的理解2013-06-06
解決Eclipse創(chuàng)建android項目無法正常預(yù)覽布局文件問題的方法
這篇文章主要介紹了解決Eclipse創(chuàng)建android項目無法正常預(yù)覽布局文件問題的方法,需要的朋友可以參考下2015-12-12
TabLayout關(guān)聯(lián)ViewPager后不顯示文字的解決方法
這篇文章主要為大家詳細(xì)介紹了TabLayout關(guān)聯(lián)ViewPager后不顯示文字的解決方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-11-11

