应用层分发事件分析(七)

本文详细介绍了Android应用层的事件分发机制,重点分析了ViewRootImpl中InputStage的作用,包括7个子类的职责,以及输入事件在处理流水线中的流转过程。讲解了按键事件和触摸事件的处理,为理解Android事件处理提供了深入洞察。
摘要由CSDN通过智能技术生成

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方法,该方法如下,


                
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值