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