1InputReader处理Input消息
在InputReaderThread继承于Thread中,读取RawEvent数据流程如下:
1) Thread::_threadLoop()
2) InputReaderThread::threadLoop()
3) InputReader::loopOnce()
4) EventHub::getEvents()
在InputReader::loopOnce中,当调用EventHub->getEvents获取Input事件,当没有Input事件的时候,线程回阻塞,直到有输入事件,读取到到RawEvent之后,调用InputReader::processEventsLocked来处理这些事件,然后调用mQueuedListener->flush()把这些队列中的事件发送到InputDispatcher。下面看处理processEventsLocked(const RawEvent* rawEvents, size_tcount)方法,在该方法中处理两种事件:
n 处理设备增加、删除和修改事件
n 处理来自于事件驱动设备的事件(processEventsForDeviceLocked)
RawEvent结构体中有一个type变量,用这个变量来识别到底是什么事件:
n EventHubInterface::DEVICE_ADDED 添加设备事件
n EventHubInterface::DEVICE_REMOVED 删除设备事件
n EventHubInterface::FINISHED_DEVICE_SCAN 完成设备扫面事件
n 小于EventHubInterface::DEVICE_ADDED 设备输入事件,包括按键、触摸等
代码如下:
voidInputReader::processEventsLocked(const RawEvent* rawEvents, size_tcount) {
for(const RawEvent* rawEvent = rawEvents; count;) {
int32_ttype = rawEvent->type; size_tbatchSize = 1; if(type < EventHubInterface::FIRST_SYNTHETIC_EVENT) {
int32_tdeviceId = rawEvent->deviceId; while(batchSize < count) {
if(rawEvent[batchSize].type >=EventHubInterface::FIRST_SYNTHETIC_EVENT ||rawEvent[batchSize].deviceId != deviceId) {
break; } batchSize+= 1; } processEventsForDeviceLocked(deviceId,rawEvent, batchSize); }else {
switch(rawEvent->type) {
caseEventHubInterface::DEVICE_ADDED: addDeviceLocked(rawEvent->when,rawEvent->deviceId); break; caseEventHubInterface::DEVICE_REMOVED: removeDeviceLocked(rawEvent->when,rawEvent->deviceId); break; caseEventHubInterface::FINISHED_DEVICE_SCAN: handleConfigurationChangedLocked(rawEvent->when); break; default: ALOG_ASSERT(false);// can't happen break; } } count-= batchSize; rawEvent+= batchSize; } } |
1.1 处理设备增加、删除和修改事件
1.1.1 增加设备