Android 的键盘事件处理

#移动开发 #Android

1. 基本流程

  1. 内核处理按键,通过设备文件的方式提供给 framework 层

  2. framework 层的 KeyInputQueue.java 启动线程从设备文件中读出键码,然后把读出的键码按 kl 文件转成相应键值

(JNI 调用 EventHub.cpp),最后写入事件队列

  1. framework 层的 WindowManagerService.java 启动线程从事件队列中读出键值,然后根据当前 focus

分发给相应窗口

  1. UI 通过 KeyCharacterMap.java 处理 kcm 规则将用户基本按键与功能键 (Shift, Alt 等)

组合,得出最终按键

2. 两个配置文件
通常更换一种新的硬件,可能其键盘布局及键码与标准版本不同,不用更改代码,只要修改以下配置文件即可(如果增加新的未定义功能的按键,则需要修改代码)

  1. xxx.kl
  1. 位置
    development/emulator/keymaps/.kl (1.6 版本模拟器使用)
    sdk/emulator/keymaps/
    .kl (2.2 版本模拟器使用)
    vendor/xxx/xxx/*.kl (特定硬件专用 kl)

  2. 功能
    硬件全键盘的键码与键值的对应规则文件(如 0x21 对应 A)

  1. xxx.kcm
  1. 位置
    development/emulator/keymaps/.kcm (1.6 版本模拟器使用)
    sdk/emulator/keymaps/
    .kcm (2.2 版本模拟器使用)
    vendor/xxx/xxx/*.kcm (特定硬件专用 kcm)

  2. 功能
    硬件全键盘的键值对应表(如按下 Alt, Shift 时按键对应的键值)

3. 相关代码

  1. frameworks/base/core/java/android/view/KeyEvent.java (按键事件定义)

  2. frameworks/base/services/java/com/android/server/KeyInputQueue.java (

事件读取线程)

  1. frameworks/base/services/java/com/android/server/WindowManagerService.java

(事件分发线程)

  1. frameworks/base/core/java/android/view/KeyCharacterMap.java (功能键转换 kcm)

  2. frameworks/base/libs/ui/EventHub.cpp (键码与键值转换)

4. 参考

  1. [http://www.armfans.net/archiver/tid-2671.html

](http://www.armfans.net/archiver/tid-2671.html)

  1. http://www.armfans.net/viewthread.php?tid=2671

(转载请注明出处: http://xy0811.spaces.live.com/)