Android2.3的输入事件流程与以前版本有了较大的不同,这里做一下详细的分析,最后我把自己分析时用的演示代码放在了这里:
http://code.google.com/p/flying-on-android/
下面的分析都是基于这些源码的,大家可以下载下来一边看源码一边看文档。源码里只要关注FlyingEvent这个类就可以了。如果只想看一下演示结果,可以直接把包里的flying放到机器的/system/bin目录执行,打开logcat后就可以看到演示输出。运行程序时,机器屏幕会有异象产生,很正常,因为这个程序原本是用于显示SurfaceFlinger的,这次为了演示EventHub稍微改了一下。大家只要关注 FlyingEvent.cpp这个文件就好了。
大家也可以用源码自己编译出演示程序,只要把解压后的flying文件夹放到/frameworks/base/cmds/目录下,然后切换到flying目录下使用mm编译。
先大致介绍一下整个流程,再做重点分析。输入事件流程一共涉及到下面这几个文件:
/frameworks/base/services/java/com/android/server/WindowManagerService.java
/frameworks/base/services/java/com/android/server/InputManager.java
/frameworks/base/services/jni/com_android_server_InputManager.cpp
/frameworks/base/libs/ui/InputReader.cpp
/frameworks/base/libs/ui/InputDispatcher.cpp
/frameworks/base/libs/ui/EventHub.cpp
其中,WindowManagerService.java和InputManager.java主要向Android为窗口系统提供服务,EventHub.cpp主要用来读取设备文件中的RawEvent,而InputReader.cpp和InputDispatcher.cpp算是它们之间的对接层。
它们的关系是:WindowManagerService通过InputManager提供的接口开启一个线程驱动InputReader不断地从 /dev/input/目录下面的设备文件读取事件,然后通过InputDispatcher分发给连接到WindowManagerService服务的客户端。
InputReader从设备文件中读取的是RawEvent,在交给InputDispatcher进行分发之前,它需要先把RawEvent进行转化分类,拆分成KeyEvent、MotionEvent、TrackEvent各种类型等。这篇文章主要关注的就是这个RawEvent的拆分过程,所以我们的重点在EventHub.cpp中。并且,为了简单化分析过程,在这里我的分析只关注触摸屏事件。看它是如何从RawEvent被拆分成应用层用户事件MotionEvent的。
看下面的分析之前,最好先去上面提到的地址把源码下载下来,参照里面的FlyingEvent.cpp。
整个过程大致分成这么几步:
一、初始化。
先new一个EventHub的实例:mEventHub(new EventHub),
接下来,开启一个线程通过mEventHub不停地从设备文件中读取RawEvent并处理:
while (1) {
RawEvent event;
mEventHub->getEvent(&event);
process(event);
}
EventHub在初始化的时候做一些事情,
1、搜索当前的输入设备每搜索到一个就会产生一个类型为DEVICE_ADDED的事件,当读取这种RawEvent时,InputReader会把搜索到的这个设备记录下来。
2、如果搜索到了键盘时,就会加载键盘布局文件。加载完成后产生一个类型为FINISHED_DEVICE_SCAN的事件。这样,后边从驱动读取用户按键时,就会去加载的键盘布局文件中寻找映射的键值封装成KeyEvent返回给用户。
二、EventHub初始化完毕后,就开始等待用户输入。线程一直阻塞在mEventHub->getEvent(&event),直到有用户事件产生才会返回。
当有一个事件产生时,传递给process进行处理。
三、事件拆分
FlyingEvent.process里面主要调用了FlyingEvent.consume方法来处理用户事件。这里只分析touch事件。touch事件可以分为三种:down,move,up。
down类型的touch事件需要四个RawEvent来完成,第一个是X坐标(ABS_X),第二个是Y坐标(ABS_Y),第三个代表方向(ABS_PRESSURE)(0的时候是up,1的时候是down,所以这里应该是1),第四个是结束标志(SYN_REPORT)。
move类型的touch事件需要三个RawEvent来完成,第一个是X坐标,第二个是Y坐标,第三个是结束标志。
up类型的touch事件需要两个RawEvent来完成,第一个代表方向(0的时候是up,1的时候是down,所以这里应该是0),第四个是结束标志。
可能你已经注意到了up事件是没有坐标信息的,它的坐标信息与down(没有move时)或最后一个move(down和up之间有move事件产生)事件的坐标相同。
从FlyingEvent.consume方法中,每一个事件最终都会生成一个TouchEvent,然后调用printTouchEvent进行打印,最后把它存储到eventBuffer中。
参考文章
李先静的“Android输入事件流程“,不过使用的Android版本比较老了。
http://blog.csdn.net/absurd/archive/2009/05/17/4195363.aspx
(摘自:http://blog.csdn.net/a345017062/article/details/6417929)
分享到:
相关推荐
这个资源里面的源码及可执行文件是用于这里这篇文档的: http://blog.csdn.net/a345017062/archive/2011/05/13/6417929.aspx 文档中对Android EventHub是基于这里面的源码和可执行程序的。
本文实例讲述了Android编程输入事件流程。分享给大家供大家参考,具体如下: EventHub对输入设备进行了封装。输入设备驱动程序对用户空间应用程序提供一些设备文件,这些设备文件放在/dev/input里面。 EventHub扫描/...
azure-eventhub-java 关于如何使用 Java 将内容提交到 Microsoft Azure 服务总线/EventHub 的演示项目。 先决条件 尝试执行或编译示例时需要安装 。 编译示例 mvn clean compile 运行示例 mvn exec:java
活动中心EventHub提供服务器端事件中心以及服务器和客户端库以与该中心进行通信。 集线器将所有事件广播到所有连接的客户端。 支持事件回调。安装% npm install EventHub -g% npm start EventHub -g这将在端口5883上...
使用系统是android5.1 根据客户需求修改的 禁用usb鼠标和键盘!客户的需求是在设置选项里面添加两个选项可以分别禁用usb鼠标 和 键盘 已经修改完成亲测!有完整的步骤和代码! 根据代码小修改一下就可以变成 随时...
资源来自pypi官网。 资源全名:azure-mgmt-eventhub-3.1.0.zip
Android 系统的键盘事件 是由InputManagerService 来监控的, 而InputManagerService 是由 SystemServer 来启动的 创建了一个类的对象 WindowInputEvent Receiver InputEventRe ceiver的构造 函数 ...
有用零代码来了解Azure EventHub中的内容很有用。 跑步 EventHub UI是使用Maven构建的Kotlin + JavaFX应用程序。 要运行该应用程序,请下载代码,然后执行: $ mvn clean javafx:run 去做 缺少一些东西: 存储...
探索ABP的EventHub解决方案.doc
eventhub-agent-qpid 基于Qpid Proton-C 0.9.1的C实现将批处理消息异步发送到事件中心概述可以在网关或设备中使用此代理,以将批处理消息异步发送到Azure Event Hub。 该代理基于Apache Qpid Proton-C以C语言实现。 ...
使用Azure EventHub根据Thinxtra Xkit生成的Sigfox数据创建PowerBI仪表板。
EventHub Web查看器此开源项目有助于查看/检查发送到Azure EventHub / IoTHub的事件。 可获得此查看器的实时版本。使用部署的版本在浏览器中打开 。 输入您的Eventhub信息: 您的集线器连接字符串(具有侦听器许可)...
Node-RED-Azure-EventHub 用于将事件发送到 Microsoft Azure 事件中心的 Node-RED
#LinkIt One EventHub演示示例,该示例使用LinkIt One与Azure网站和EventHub进行通信 ###创建EventHub 本自述文件的底部有一个快速浏览的视频,它将提供有关安装的更多详细信息。 在非预览版Azure门户中创建一个新...
迅捷的EventHub Swift中使用通用类型定义的回调/监听器的简单typesafe EventHub。例子打回来 struct CounterEvent : Event { let currentCount: Int}let eventHub = EventHub ( queue : . global ())eventHub. ...
golang-azure-eventhub-kafka:与Azure Event Hub连接为Kafka主题的示例
有关4.0按键的处理流程,包括windowmanagerservice的激动启动等
python库。 资源全名:azure_eventhub-1.3.1-py2.py3-none-any.whl
安装在Node-RED安装的根目录中运行以下命令(由于该模块尚未发布到npm,因此您需要从github安装它) npm install plkumar/node-red-contrib-eventhub链接 [Node-RED]: http://nodered.org/[node-sbus-amqp10]: ...