欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android?Framework層獲取及處理按鍵事件流程

 更新時間:2022年08月31日 10:30:09   作者:內(nèi)核筆記???????  
本文主要介紹了Android?Framework層獲取及處理按鍵事件流程,Android系統(tǒng)的輸入事件是InputManagerService服務(wù)來監(jiān)控的,該系統(tǒng)服務(wù)在SystemServer的startOtherServices()中初始化,更多介紹需要的小伙伴可以參考一下

前言

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

  • 通過EventHub的getEvents()方法獲取輸入事件;
  • 調(diào)用processEventsLocked()方法來處理輸入事件;
  • 通過mQueuedListenerflush()方法將輸入事件發(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)文章

最新評論