android的frameworks層鍵盤事件處理流程分析

來源:互聯網
上載者:User
android的frameworks層鍵盤事件處理流程分析

事件處理流程
1)InputManager負責讀取事件並把事件送到frameworks的java層
2)WindowManagerService裡會有一個InputMonitor類來監聽事件變化並做相應的分發處理。
3)在WindowManagerService會有一個WindowManagerPolicy來做訊息攔截處理。
4)WindowManagerService會把訊息發給最上面啟動並執行視窗接收

源碼分析
WindowManagerService.java主要向Android為視窗系統提供服務,把KeyEvent分發給最上層的視窗;
WindowManagerService通過InputManager提供的native介面開啟了兩個線程驅動做KeyEvent讀取和分發給WindowManagerService管理的用戶端。
mInputManager = new InputManager(context, this);
mInputManager.start();

InputManager是WindowManagerService的成員變數,主要實現了讀取RawEvent,分發事件給WindowManagerService;
InputManager.java的native代碼InputManager.cpp實現了讀取和事件分發,他初始化兩個線程
void InputManager::initialize() {
    mReaderThread = new InputReaderThread(mReader);//不斷地從/dev/input/目錄下面的裝置檔案讀取事件
    mDispatcherThread = new InputDispatcherThread(mDispatcher);//事件分發
}
InputManager通過InputManager.Callbacks類響應回調,在回調裡再調用WindowManagerService.InputMonitor來接收事件。並在WindowManagerService.InputMonitor.interceptKeyBeforeQueueing()和 interceptKeyBeforeDispatching()進行訊息攔截處理。處理的代碼如下:
WindowManagerPolicy mPolicy = PolicyManager.makeNewWindowManager();
        /* Provides an opportunity for the window manager policy to intercept early key
         * processing as soon as the key has been read from the device. */
        public int interceptKeyBeforeQueueing(long whenNanos, int keyCode, boolean down,
                int policyFlags, boolean isScreenOn) {
            return mPolicy.interceptKeyBeforeQueueing(whenNanos,
                    keyCode, down, policyFlags, isScreenOn);
        }
攔截處理的執行代碼就在PhoneWindowManager.interceptKeyBeforeQueueing()方法中。詳細的請參看源碼

EventHub.cpp主要用來讀取裝置檔案中的RawEvent,而InputReader.cpp和InputDispatcher.cpp算是它們之間的對接層。InputReader從裝置檔案中讀取的是RawEvent,在交給InputDispatcher進行分發之前,它需要先把RawEvent進行轉化分類,拆分成KeyEvent、MotionEvent、TrackEvent各種類型等。

相關原始碼位置
/frameworks/base/services/java/com/android/server/WindowManagerService.java(事件分發給最前面的視窗)
/frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java(攔截訊息的處理類)
/frameworks/base/core/java/android/view/KeyEvent.java(按鍵事件定義)
/frameworks/base/services/java/com/android/server/InputManager.Java(Java層輸入管理)
/frameworks/base/libs/ui/InputManager.cpp(native層輸入管理)
/frameworks/base/libs/ui/InputReader.cpp(事件讀取線程)
/frameworks/base/libs/ui/InputDispatcher.cpp(事件分發線程)
/frameworks/base/libs/ui/EventHub.cpp(鍵碼與索引值轉換)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.