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/)

posted on 2010-08-18 13:48  xieyan0811  阅读(31)  评论(0编辑  收藏  举报