没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
1
在 Android 系统中,键盘按键事件是由 SystemServer 服务来管理的;
然后在以消息的形式分发给应用程序处理。产生键盘按键事件则是有
Linux kernel 的相关驱动来实现。键盘消息有别于其他类型的消息;
需要从 Linux kernel drivers 产生由上层 APP 来处理。同时按键有
着不同的映射值,因此从模块独立性角度各个独立的模块应该拥有不
同的键盘映射。这样以来,kernel 产生的按键事件必然回经过不同
的映射才到 APP。
Android 使用标准的 Linux 输入事件设备(/dev/input/)和驱动按键
定义在 Linux 内核 include/linux/input.h 中,按键的定义形式如下
(仅以 BACK HOME MENU 为例):
Kernel 内核驱动会产生事件,在这里就不讨论了,不是本文的范畴;
下面分析 Framework 事件处理流程。
SystemServer.java
2
可以看到,在系统启动的时候,会首先创建一个系统级别的 Handler
线程 wmHandlerThread 用于处理键盘消息(仅说明键盘消息)。然后在
创建输入管理服务 inputManager,InputManagerService 的第二个参
数就是用于处理按键消息的 Handler。
InputManagerService.java
进入 InputManagerService 的构造函数:
这里做了重要的两件事情,第一:将 SystemServer 级别的 Handler
赋值给 InputManagerService 自己的消息处理 Handler;第二:调用
nativeInit 继续进行初始化。
com_android_server_input_InputManagerService.java
那就看看本地初始化:
进入 NativeInputManager 构造函数:
3
这里需要特别注意最后两行代码。第一:创建了 EventHub;第二:
创建 InputManager 并将 EventHub 作为参数传入 InputManager。
InputManager.cpp
接下来继续看看 InputManager 的构造函数:
创建了 InputDispatcher 和 InputReader, 请注意 00032 行,
mDispatcher 作为了 InputReader 参数,你看看 InputReader 的构造
4
函数就知道为什么要这么做了;后面调用了 initialize 函数创建了
InputReaderThread 和 InputDispatcherThread。InputDispatcher
类是负责把键盘消息分发给当前激活的 Activity 窗口的,而
InputReader 类则是通过 EventHub 类来实现读取键盘事件的,
InputReader 实列 mReader 就是通过这里的 InputReaderThread 线程
实列 mReaderThread 来读取键盘事件的,而 InputDispatcher 实例
mDispatcher 则是通过这里的 InputDispatcherThread 线程实例
mDisptacherThread 来分发键盘消息的;到这里,相关的组件都已经
被创建了。
在 systemServer.java 中创建 inputManager 之后。将
InputManagerServer 进行注册,并运行 start()(在第一页有相关代
码)。
com_android_server_input_InputManagerService.java
会来到这里:
继续往下则会调用到
InputManager.cpp
的 start()函数:
剩余16页未读,继续阅读
资源评论
我说HelloWorld
- 粉丝: 1924
- 资源: 36
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功