Android input 系统之二:InputDispatcher线程
touch事件处理流程:
touch事件数据获取处理后分发流程:
"InputDispatcher 线程"
InputDispatcher::InputDispatcher(const sp<InputDispatcherPolicyInterface>& policy) :
//创建Looper对象
mLooper = new Looper(false);
bool InputDispatcherThread::threadLoop()
mDispatcher->dispatchOnce() //整个过程不断循环地调用InputDispatcher的dispatchOnce()来分发事件
void InputDispatcher::dispatchOnce() frameworks/native/services/inputflinger/InputDispatcher.cpp
//唤醒等待线程,monitor()用于监控dispatcher是否发生死锁
mDispatcherIsAliveCondition.broadcast();
//当mCommandQueue不为空时处理
>>>>>>>>>>> dispatchOnceInnerLocked(&nextWakeupTime);
nsecs_t currentTime = now(); //当前时间,也是后面ANR计时的起点
if (!mDispatchEnabled) {
//默认值为false
resetKeyRepeatLocked(); //重置操作
}
if (mDispatchFrozen) {
//默认值为false
return; //当分发被冻结,则不再处理超时和分发事件的工作,直接返回
}
//优化app切换延迟,当切换超时,则抢占分发,丢弃其他所有即将要处理的事件。
bool isAppSwitchDue = mAppSwitchDueTime <= currentTime;
...
if (!mPendingEvent) {
if (mInboundQueue.isEmpty()) {
if (!mPendingEvent) {
return; //没有事件需要处理,则直接返回
}
} else {
//从mInboundQueue取出头部的事件
mPendingEvent = mInboundQueue.dequeueAtHead();
}