日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

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

作者:內核筆記??????? ? 更新時間: 2022-10-26 編程語言

前言

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

  • 通過EventHub的getEvents()方法獲取輸入事件;
  • 調用processEventsLocked()方法來處理輸入事件;
  • 通過mQueuedListenerflush()方法將輸入事件發送到InputDispatcher

下面分別介紹這幾個過程。

一、EventHub的getEvents()

該方法實現邏輯可簡述成圖所示的流程:?

如果是第一次調用該方法的話,則需要先掃描/dev/input目錄下的輸入設備;接著用mPendingEventItems保存待處理的輸入事件;隨后判斷是否有輸入事件需要處理,有則立即返回;否則通過epoll_wait等待輸入事件到來。

二、InputReader的processEventsLocked()

當獲取到輸入事件之后,就會調用processEventsLocked()方法來處理:

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

  • 在processEventsForDeviceLocked()方法里,首先獲取設備索引,然后根據設備索引獲取設備,最后調用InputDevice的process()方法來處理。
  • 在process()方法里,遍歷處理所有輸入事件,并循環調用所有mapper來處理每一個輸入事件。按鍵事件中,KeyboardInputMapper的process()方法首先會判斷掃描碼是不是鍵盤碼,如果是,就調用processKey()方法處理。
  • 在processKey()方法中,首先根據掃描碼獲取到對應的keyCode方法,然后構建NotifyKeyArgs對象,最后調用QueuedInputListener的notifyKey()方法通知key事件。notifyKey()方法首先按對鍵事件進行檢查、驗證;其次處理特殊按鍵;然后把按鍵放到InboundQueue隊列,最后調用Looper的wake方法向管道中寫入字符,喚醒InputDispatcherThread。

原文鏈接:https://juejin.cn/post/7137282491236220936

欄目分類
最近更新