framework按键处理流程

1.基本流程       

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

2)framework层的KeyInputQueue.java启动线程从设备文件中读出键码,然后把读出的键码按kl文件转成相应键值(JNI调用EventHub.cpp),最后写入事件队列

      ps:读取键盘具体应该是eventHub类处理

3)framework层的WindowManagerService.java启动线程从事件队列中读出键值,然后根据当前focus分发给相应窗口

      ps:刚才是 读 键码,现在是键值。

4)UI通过KeyCharacterMap.java处理kcm规则将用户基本按键与功能键(Shift, Alt等)组合,得出最终按键

 

2.两个配置文件

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

      1)xxx.kl

      a)代码位置

      sdk/emulator/keymaps/ kl结尾文件(2.2版本模拟器使用) 。

      b)功能

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

      2)xxx.kcm

      a)代码位置

      sdk/emulator/keymaps/kcm结尾文件(2.2版本模拟器使用)

      b)功能

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

           PS:又提到kl..kcm前面来自驱动层,kcm这里有组合键,还有home..

 

3.整个流程相关代码          

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

2)frameworks/base/services/java/com/android/server/KeyInputQueue.java(事件读取线程)

      //PS:相当于getMessage,待定。

3)frameworks/base/services/java/com/android/server/WindowManagerService.java(事件分发线程)

      //PS:相当于postMessage,sendMessage ,待定。

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

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


欲知深层次究竟,参看http://www.2cto.com/kf/201111/111715.html。

http://blog.csdn.net/darkengine/article/details/7072931    -----------  InputReader.cpp

http://blog.csdn.net/yclzh0522/article/details/6920522

你可能感兴趣的:(Android)