事件处理流程

1)InputManager负责读取事件并把事件送到frameworks的java层
2)WindowManagerService里会有一个InputMonitor类来监听事件变化并做相应的分发处理。
3)在WindowManagerService会有一个WindowManagerPolicy来做消息拦截处理。
4)WindowManagerService会把消息发给最上面运行的窗口接收

源码分析

WindowManagerService.java主要向 Android 为窗口系统提供服务,把KeyEvent分发给最上层的窗口;
WindowManagerService通过InputManager提供的native接口开启了两个线程驱动做KeyEvent读取和分发给WindowManagerService管理的客户端。
mInputManager = new InputManager(context, this);
mInputManager.start();

InputManager是WindowManagerService的成员变量,主要实现了读取RawEvent,分发事件给WindowManagerService;
InputManager.java的native代码InputManager.cpp实现了读取和事件分发,他初始化两个线程
void InputManager::initialize() {
mReaderThread = new InputReaderThread(mReader);//不断地从/dev/input/目录下面的设备文件读取事件
mDispatcherThread = new InputDispatcherThread(mDispatcher);//事件分发
}
InputManager通过InputManager.Callbacks类响应回调,在回调里再调用WindowManagerService.InputMonitor来接收事件。并在WindowManagerService.InputMonitor. interceptKeyBeforeQueueing ()和 interceptKeyBeforeDispatching ()进行消息拦截处理。处理的代码如下:
WindowManagerPolicy mPolicy = PolicyManager.makeNewWindowManager();
/* Provides an opportunity for the window manager policy to intercept early key
* processing as soon as the key has been read from the device. */
public int interceptKeyBeforeQueueing(long whenNanos, int keyCode, boolean down,
int policyFlags, boolean isScreenOn) {
return mPolicy.interceptKeyBeforeQueueing(whenNanos,
keyCode, down, policyFlags, isScreenOn);
}
拦截处理的执行代码就在PhoneWindowManager. interceptKeyBeforeQueueing ()方法中。详细的请参看源码

EventHub.cpp主要用来读取设备文件中的RawEvent,而InputReader.cpp和InputDispatcher.cpp算是它们之间的对接层。InputReader从设备文件中读取的是RawEvent,在交给InputDispatcher进行分发之前,它需要先把RawEvent进行转化分类,拆分成KeyEvent、MotionEvent、TrackEvent各种类型等。

相关源代码位置

/frameworks/base/services/java/com/android/server/WindowManagerService.java(事件分发给最前面的窗口)
/frameworks/base/policy/src/com/android/internal/policy/impl/ PhoneWindowManager.java (拦截消息的处理类)
/frameworks/base/core/java/android/view/KeyEvent.java(按键事件定义)
/frameworks/base/services/java/com/android/server/InputManager.Java(Java层输入管理)
/frameworks/base/libs/ui/InputManager.cpp(native层输入管理)
/frameworks/base/libs/ui/InputReader.cpp(事件读取线程)
/frameworks/base/libs/ui/InputDispatcher.cpp(事件分发线程)
/frameworks/base/libs/ui/EventHub.cpp(键码与键值转换)
转自:http://www.linuxidc.com/Linux/2011-11/47125.htm

更多相关文章

  1. 《Monkey Android》第6课点击事件的四种写法
  2. Android(安卓)触摸事件机制(四) ViewGroup中触摸事件详解
  3. EventBus第一章:初识,相见,了解,使用
  4. RxJava2 使用详解一之基础教程
  5. Android(安卓)ApiDemos示例解析(112):Views->Expandable Lists->
  6. Android截屏事件监听
  7. Android图集的上下左右拖动及动画效果研究,图片拖拽或视频拖拽
  8. wpa_supplicant适配层 -- 详解
  9. Android(安卓)JB 4.2 中InputManager 分发键盘消息给应用程序的

随机推荐

  1. mysql分页性能探索
  2. MySQL5.7.17安装及配置图文教程
  3. 详细解读分布式锁原理及三种实现方式
  4. mysql Community Server 5.7.19安装指南(
  5. 史上最简单的MySQL数据备份与还原教程(上
  6. MySQL导出数据遇到secure-file-priv问题
  7. 详解mysql数据库中文乱码问题
  8. MySQL数据文件存储位置的查看方法
  9. MySQL数据库输入密码后闪退问题的解决方
  10. 史上最简单的MySQL数据备份与还原教程(中