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

更多相关文章

  1. SpringBoot 2.0 中 HikariCP 数据库连接池原理解析
  2. Android—实现自定义相机倒计时拍照
  3. Android(安卓)Studio安装与使用最详细的图解教程
  4. Android疑问1——Handler的removeCallbacks方法无效?(已经明白了)
  5. Android插件—H.A.X.M(硬件加速执行管理器)
  6. Android(安卓)FFmpeg系列——3 C多线程使用
  7. 【Android】java.lang.AssertionError use looper thread, must
  8. Andriod中的Handler机制
  9. Android(安卓)AsyncTask基础知识整理

随机推荐

  1. android 发送短信sms
  2. Android Studio第三十四期 - git企业级应
  3. Android max17044平台驱动注册
  4. Android获取其他包的Context实例,然后调用
  5. android编译报错-Could not find com.and
  6. android 获得 View
  7. Android CircularFloatingActionMenu (1)
  8. Android(安卓)学习之相机(一)
  9. 【android】getCacheDir()、getFilesDir(
  10. android仿安卓微信、云播雷达扫描动画效