Android的键盘事件处理
Android 的键盘事件处理
#移动开发 #Android
1. 基本流程
内核处理按键,通过设备文件的方式提供给 framework 层
framework 层的 KeyInputQueue.java 启动线程从设备文件中读出键码,然后把读出的键码按 kl 文件转成相应键值
(JNI 调用 EventHub.cpp),最后写入事件队列
- framework 层的 WindowManagerService.java 启动线程从事件队列中读出键值,然后根据当前 focus
分发给相应窗口
- UI 通过 KeyCharacterMap.java 处理 kcm 规则将用户基本按键与功能键 (Shift, Alt 等)
组合,得出最终按键
2. 两个配置文件
通常更换一种新的硬件,可能其键盘布局及键码与标准版本不同,不用更改代码,只要修改以下配置文件即可(如果增加新的未定义功能的按键,则需要修改代码)
- xxx.kl
位置
development/emulator/keymaps/.kl (1.6 版本模拟器使用)
sdk/emulator/keymaps/.kl (2.2 版本模拟器使用)
vendor/xxx/xxx/*.kl (特定硬件专用 kl)功能
硬件全键盘的键码与键值的对应规则文件(如 0x21 对应 A)
- xxx.kcm
位置
development/emulator/keymaps/.kcm (1.6 版本模拟器使用)
sdk/emulator/keymaps/.kcm (2.2 版本模拟器使用)
vendor/xxx/xxx/*.kcm (特定硬件专用 kcm)功能
硬件全键盘的键值对应表(如按下 Alt, Shift 时按键对应的键值)
3. 相关代码
frameworks/base/core/java/android/view/KeyEvent.java (按键事件定义)
frameworks/base/services/java/com/android/server/KeyInputQueue.java (
事件读取线程)
- frameworks/base/services/java/com/android/server/WindowManagerService.java
(事件分发线程)
frameworks/base/core/java/android/view/KeyCharacterMap.java (功能键转换 kcm)
frameworks/base/libs/ui/EventHub.cpp (键码与键值转换)
4. 参考
- [http://www.armfans.net/archiver/tid-2671.html
](http://www.armfans.net/archiver/tid-2671.html)
- http://www.armfans.net/viewthread.php?tid=2671
(转载请注明出处: http://xy0811.spaces.live.com/)