在之前,整理了输入系统服务InputManagerService(服务的生成、启动),EventHub(读取原始输入事件、设备增删)。接着来了解一下InputReader,InputReader主要工作是从EventHub读取事件、进行加工、将加工好的事件发送到InputDispatcher。
1 InputReader初始化
由InputManagerService这篇博客中,可知InputManagerService初始化的时候,一层层调用,最终在InputManager中初始化InputReader和InputReaderThread。
先看下InputReader的构造函数
InputReader::InputReader(const sp<EventHubInterface>& eventHub,
const sp<InputReaderPolicyInterface>& policy,
const sp<InputListenerInterface>& listener) :
mContext(this), mEventHub(eventHub), mPolicy(policy),
mGlobalMetaState(0), mGeneration(1),
mDisableVirtualKeysTimeout(LLONG_MIN), mNextTimeout(LLONG_MAX),
mConfigurationChangesToRefresh(0) {
mQueuedListener = new QueuedInputListener(listener);
{ // acquire lock
AutoMutex _l(mLock);
refreshConfigurationLocked(0);
updateGlobalMetaStateLocked();
} // release lock
}
初始化必要的变量,mEventHub对应EventHub对象,mPolicy对应NativeInputManager对象,mGlobalMetaState表示控制键的状态,mGeneration表示输入设备的状态,mQueuedListener用来将加工后的按键事件传到InputDispatcher。
2 InputReaderThread循环体
InputManagerService的start() 层层调用 最后调用到 InputManager的start()中。
result = mReaderThread->run("InputReader", PRIORITY_URGENT_DISPLAY);
InputReaderThread开始运行,以下是InputReaderThread的线程循环,返回true则循环不断的调用threadLoop()方法,返回false则退出循环。
bool InputReaderThread::threadLoop() {
mReader->loopOnce();
return true;
}
该线程中会循环不断的执行mReader->loopOnce();看一下loopOnce中具体干了些什么。
void InputReader::loopOnce() {
int32_t oldGeneration;
int32_t timeoutMillis;
bool inputDevicesChanged = false;
Vector<InputDeviceInfo> inputDevices;
{ // acquire lock
AutoMutex _l(mLock);
oldGeneration = mGeneration;
timeoutMillis = -1;
//查看InputReader配置是否修改,如界面大小、方向、键盘布局重新加载、指针速度改变等
uint32_t changes = mConfigurationChangesToRefresh;
if (changes) {
mConfigurationChangesToRefresh = 0;
timeoutMillis = 0;
refreshConfigurationLocked(changes); //刷新配置
} else if (mNextTimeout != LLONG_MAX) {
nsecs_t now = systemTime(SYSTEM_TIME_MONOTONIC);
timeoutMillis = toMillisecondTimeoutDelay(now, mNextTimeout);
}
} // release lock
//获取输入事件、设备增删事件,count为事件数量。
size_t count = mEventHub->getEvents(timeoutMillis, mEventBuffer, EVENT_BUFFER_SIZE);
{ // acquire lock
AutoMutex _l(mLock);
mReaderIsAliveCondition.broadcast();
if (count) {//处理事件
processEventsLocked(mEventBuffer, count);
}
if (mNextTimeout !