Android Input Framework(二)---EventHub
来源:互联网 发布:原生js 触发事件 编辑:程序博客网 时间:2024/05/17 01:49
1 EventHub获取输入设备数据
EventHub可以看成是输入消息的集散地,因为android支持多种输入设备,而各种设备的消息类型可能不一样,为了统一管理这些输入消息,Android提出了EventHub的概念,所有的输入事件都会通过EventHub收集,并通过EventHub传递给InputReader,这样对上层来说,就不需要关注底层设备的多样性,减少了上层使用的复杂性。EventHub同时还负责扫描和加载所有的输入设备,InputReader在第一次读取数据的时候会扫描所有的输入设备,并保存每个设备的配置信息。
1.1 打开设备
在EventHub::getEvents中,当mNeedToScanDevices为true时(当创建EventHub对象时,它就为true),即当InputReader第一次调用getEvents的时候需要打开设备,它将从/dev/input目录下查找所有设备,并进行打开,获取其相关属性,最后加入mDevices列表中。
// Register withepoll.
}
addDeviceLocked(device);
1.2 读取输入事件
n
n
n
看看epoll_event结构体:
typedef unionepoll_data
{
} epoll_data_t;
structepoll_event
{
};
每个设备被创建(在函数EventHub::openDeviceLocked中)时,都会向epoll注册,代码如下:
}
查看设备上是否有输入事件:
int pollResult =epoll_wait(mEpollFd,mPendingEventItems, EPOLL_MAX_EVENTS, timeoutMillis);
在调用epoll_wait()之后,读到的epoll_event输入事件保存在mPendingEventItems,总共的事件数保存在mPendingEventCount,当然,在调用epoll_wait()之前,mPendingEventIndex被清0。
size_tEventHub::getEvents(int timeoutMillis, RawEvent* buffer, size_tbufferSize) {
}
在上面的代码中可以看到,如果没有输入事件,那么代码将在epoll_wait()阻塞,当有输入事件的时候读到数据,mPendingEventItems保存了输入事件,mPendingEventCount保存了事件的数量,而且mPendingEventIndex=0,所以此时满足了条件:mPendingEventIndex <mPendingEventCount,将进入while循环mPendingEventCount次,每次通过read()方法读取相对应的输入数据。
1.3 读取输入数据
首先,需要看看相关的数据结构:
经过1.2小节介绍,我们知道,epoll_event结构体是用来存储输入事件的,调用epoll_wait()读取输入事件,一般情况下mPendingEventCount=1,当有输入事件的时候,通过read()方法读取输入数据。
size_tEventHub::getEvents(int timeoutMillis, RawEvent* buffer, size_tbufferSize) {
size_t capacity = bufferSize;
while (mPendingEventIndex <mPendingEventCount) {
}
}
return event- buffer
}
我们来分下上面的代码,先看看几个重要的变量
n
一个RawEvent结构体的一个数组,数组元素个数为bufferSize,buffer看成这个数组的指针。
n
n
一个input_event结构体的一个数组,数组元素个数为bufferSize,在read()方法中用于读取一个输入事件的数据。
n
表示读取了多少组数据。
我们模拟按下一个按键然后松开为例子,在上面代码中加了两个打印。
n
按下按键被描述才一次输入的事件,log打印如下:
mPendingEventCount=1
/dev/input/event0 got:t0=658, t1=734424, type=1, code=1, value=1
/dev/input/event0 got:t0=658, t1=734434, type=0, code=0, value=0
第二行表示按键按下的消息value=1
第三行表示该消息结束标志
n
按键松开被描述成一个输入事件,log打印如下:
mPendingEventCount=1
/dev/input/event0 got:t0=658, t1=765679, type=1, code=1, value=0
/dev/input/event0 got:t0=658, t1=765694, type=0, code=0, value=0
第一行,mPendingEventCount=1表示一个输入事件
第二行表示按键松开的消息value=0
第三行表示该消息结束标志
对上面变量的分析之后,思路应该清晰多了。在调用getEvents()的时候,将buffer作为参数传进来,并赋值给event,event用来存储输入事件的数据。将readBuffer指针传入kernel获取输入事件数据,经过for循环,将input_event数据映射到RawEvent上。在return那里返回了描述一个输入事件的RawEvent结构体数组的个数。在上面我们可以看到,描述一个按键的输入事件只需要两个RawEvent,相对简单,但是,触摸事件相对复杂些。
参考博客:http://blog.csdn.net/myarrow/article/details/7091061
- Android Input Framework(二)---EventHub
- Android Input Framework(二)---EventHub
- Android Input Framework(二)---EventHub
- Android Input流程分析(二):EventHub
- Android 输入系统(二)EventHub
- EventHub分析(二)
- Android Input framework(一)
- android 4.0 framework input
- Android Input Framework(一)
- Android Input framework(一)
- Android Input Framework(一)
- Android Input Framework(一)
- Android 输入事件系统之 EventHub 和 Input Lib(事件解析库)
- eventhub
- EventHub
- Android Framework------之Input子系统
- Android Framework------之Input子系统
- Android Framework------之Input子系统
- python_web开发笔记
- 小白使用Linux--linux下使用github遇到的小问题
- Oracle exp/imp 导入导出命令
- shell 总结
- 第十五周项目一——验证算法之冒泡排序
- Android Input Framework(二)---EventHub
- 爬虫基础-网站篇
- 【16-20】LeetCode:Python解题
- 决策树算法 python实现
- 「Deep Learning」Instance Normalization
- Android Input Framework(三)---InputReader&InputDispatcher
- 修饰符权限
- mybatis官网参考文档-XML配置_映射器(mappers)(版本: 3.4.6-SNAPSHOT)
- LNMP环境安装包配置