編輯:關於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()這麼一個函數.
有很多人也寫過創建桌面快捷鍵的blog,但是大部分都只講了怎麼用,其實技術使用起來都很簡單,但是你使用後下次還知道嗎? 根本原因還是不清楚原理,今天我就來講講shor
在運行Java測試Demo的時候,我感覺eclipse比as方便而且速度快。在AS上新建Java項目步驟如下(可能有更簡單的方法,由於是新手,見諒):1、新建一個Andr
現在越來越多的軟件都開始使用沉浸式狀態欄了,下面總結一下沉浸式狀態欄的兩種使用方法注意!沉浸式狀態欄只支持安卓4.4及以上的版本狀態欄:4.4上是漸變色,5.0上是完全透
什麼是wipe?wipe什麼意思?雙wipe又是什麼?安卓手機如何wipe?對於剛接觸安卓手機的同學來說是比較模糊的概念,那到底wipe是什麼意思呢,下面來