Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android中上層是如何接收按鍵事件的

android中上層是如何接收按鍵事件的

編輯:關於Android編程

frameworks/base/libs/ui/EventHub.cpp
按電源鍵後,系統把scanCode寫入對應的設備接點,frameworks/base/libs/ui/EventHub.cpp去讀這個設備結點,並把scanCode通過.kl文件對應成keyCode發送到上層

framework/base/services/java/com/android/server/KeyInputQueue.java通過jni調用framework/base/services/jni/com_android_server_KeyInputQueue.cpp調用EventHub.cpp裡的文件。

KeyInputQueue.java進入死循環先執行readEvent,調用EventHub.cpp中的getEvent等待輸入。

EventHub.cpp中的getEvent進入死循環,執行pollres = poll(mFDs, mFDCount, -1)等待設備結點處有數據寫入(也就是有鍵按下),當有數據寫入時執行下面的for循環,找出是那個fd中有內容寫入,並讀出寫入的數據res = read(mFDs[i].fd, &iev, sizeof(iev))。這裡只讀出了TYPE和Scancode(),而不會有Keycode,硬件層只能向設備文件寫入Scancode,而Keycode是上層要用的,由map得到。接下來接用err = mDevices[i]->layoutMap->map(iev.code, outKeycode, outFlags)map出Scancode對應的Keycode和Flags。mpa是在中實現的,是在m_keys中根據scanCode找到這兩個值。而m_keys是在KeyLayoutMap.cpp這個文件中load時,讀取kl(一般在手機的/system/usr/keylayout文件夾下)文件,解析出所有的scanCode對應的keyCode和flag來並加到m_keys中得到的。kl文件中的類似宏的字符如POWER是在frameworks/base/include/ui/KeycodeLabels.h中對應出來的。

WindowManagerService.java文件,我們找 到WindowManagerService的構造函數,(至於WindowManagerService這個類在android整個系統中的作用將是我 接下來需要研究的內容,在這裡先不做研究)
private WindowManagerService(Context context, PowerManagerService pm,
boolean haveInputMethods) {

...........................
..........................

mQueue = new KeyQ();

mInputThread = new InputDispatcherThread();

........................................
.......................................

mInputThread.start();

// Add ourself to the Watchdog monitors.
Watchdog.getInstance().addMonitor(this);
}

發現在這個構造函數裡將新起一個線程。看取的名字就應該能猜出是用來獲取用戶輸入的。KeyQ我們可以看到是派生自KeyInputQueue類的,繼續 打開KeyInputQueue查看,可以看到在構造函數中同樣起了一個線程,而且這個線程是一個死循環,它會在這麼一個循環中不停的調用 readEvent()這麼一個函數.

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved