zoukankan      html  css  js  c++  java
  • Android的键盘事件处理流程学习

    clip_image002

     

    type:文字博文

    topic:Android 应用程序开发经验

    contest logo:第二届 Google 暑期大学生博客分享大赛 - 2011 Android 成长篇

                      clip_image003

     

    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(键码与键值转换)

  • 相关阅读:
    今天面试一些程序员(新,老)手的体会
    UVA 10635 Prince and Princess
    poj 2240 Arbitrage
    poj 2253 Frogger
    poj 2485 Highways
    UVA 11258 String Partition
    UVA 11151 Longest Palindrome
    poj 1125 Stockbroker Grapevine
    poj 1789 Truck History
    poj 3259 Wormholes
  • 原文地址:https://www.cnblogs.com/titer1/p/2138625.html
Copyright © 2011-2022 走看看