4, inputDispatching Timeout
当input事件处理得慢就会触发ANR.
ANR时间区别便是指当前这次的事件dispatch过程中执行findFocusedWindowTargetsLocked()方法到下一次执行resetANRTimeoutsLocked()的时间区间.
在InputDispatcher.cpp的事件分发过程中, 如果是Key event事件,则会调用dispatchKeyLocked方法;
如果是Motion event事件,则会调用dispatchMotionLocked方法;
dispatchKeyLocked方法会调用findTouchedWindowTargetsLocked方法进行超时记录,如下,
int32_t injectionResult = findFocusedWindowTargetsLocked(currentTime,
entry, inputTargets, nextWakeupTime);
最后调用dispatchEventLocked继续处理事件。
dispatchEventLocked(currentTime, entry, inputTargets);
dispatchMotionLocked方法中会根据触摸事件是点触摸还是轨迹球事件分别进行超时记录,
if (isPointerEvent) {
// Pointer event. (eg. touchscreen)
injectionResult = findTouchedWindowTargetsLocked(currentTime,
entry, inputTargets, nextWakeupTime, &conflictingPointerActions);
} else {
// Non touch event. (eg. trackball)
injectionResult = findFocusedWindowTargetsLocked(currentTime,
entry, inputTargets, nextWakeupTime);
}
如果是点触摸则调用findTouchedWindowTargetsLocked方法进行处理;
如果是其他,例如轨迹球事件则调用findFocusedWindowTargetsLocked方法进行处理。
最后都调用dispatchEventLocked继续处理事件,
dispatchEventLocked(currentTime, entry, inputTargets);
最后无论是findTouchedWindowTargetsLocked还是findFocusedWindowTargetsLocked方法,都会调用handleTargetsNotReadyLocked方法。
injectionResult = handleTargetsNotReadyLocked(currentTime, entry,
mFocusedApplicationHandle, mFocusedWindowHandle, nex