1 概念
从硬件的角度看,事件主要分为以下几类:
1,按键事件(KeyEvent)
2,触摸事件(TounchEvent)
3,鼠标事件(MouseEvent)
4,轨迹球事件(TrackballEvent)
2 ViewRootImpl事件处理
底层通过JNI会调用ViewRootImpl内部类WindowInputEventReceiver的onInputEvent方法,然后直接调用enqueueInputEvent方法,
void enqueueInputEvent(InputEvent event,
InputEventReceiver receiver, int flags, boolean processImmediately) {
adjustInputEventForCompatibility(event);
QueuedInputEvent q = obtainQueuedInputEvent(event, receiver, flags);
// Always enqueue the input event in order, regardless of its time stamp.
// We do this because the application or the IME may inject key events
// in response to touch events and we want to ensure that the injected keys
// are processed in the order they were received and we cannot trust that
// the time stamp of injected events are monotonic.
QueuedInputEvent last = mPendingInputEventTail;
if (last == null) {
mPendingInputEventHead = q;
mPendingInputEventTail = q;
} else {
last.mNext = q;
mPendingInputEventTail = q;
}
mPendingInputEventCount += 1;
Trace.traceCounter(Trace.TRACE_TAG_INPUT, mPendingInputEventQueueLengthCounterName,
mPendingInputEventCount);
if (processImmediately) { // 是否立即处理消息
doProcessInputEvents();
} else {
scheduleProcessInputEvents(); // 发送handler消息,最终也会调用doProcessInputEvents方法
}
}
doProcessInputEvents会调用deliverInputEvent方法,该方法如下,