事件分发三连问:事件是如何从屏幕点击最终到达-Activity-的?CANCEL-事件什么时候会触发

本文深入探讨了Android事件分发机制,从屏幕点击如何到达Activity,详细解析了事件从InputDispatcher到ViewRootImpl,WindowInputEventReceiver的传递过程,并讨论了CANCEL事件的触发条件和滑动冲突的解决策略。通过对事件分发流程的分析,有助于理解Android应用内部的事件处理逻辑。
摘要由CSDN通过智能技术生成

void InputDispatcher::dispatchOnceInnerLocked(nsecs_t* nextWakeupTime) {
// 从队列中取出一个事件
mPendingEvent = mInboundQueue.dequeueAtHead();
// 根据不同的事件类型,进行不同的操作
switch (mPendingEvent->type) {
case EventEntry::TYPE_CONFIGURATION_CHANGED: {
// …
case EventEntry::TYPE_DEVICE_RESET: {
// …
case EventEntry::TYPE_KEY: {
// …
case EventEntry::TYPE_MOTION: {
// 派发事件
done = dispatchMotionLocked(currentTime, typedEntry,
&dropReason, nextWakeupTime);
break;
}
}

上面通过 dispatchMotionLocked 方法派发事件,具体的函数调用过程省略如下:

dispatchMotionLocked -> dispatchEventLocked -> prepareDispatchCycleLocked -> enqueueDispatchEntriesLocked -> startDispatchCycleLocked -> publishMotionEvent -> InputChannel.sendMessage

其中会找到当前合适的 Window,然后调用 InputChannel 去发送事件。

这里的 InputChannel 对应的是 ViewRootImpl 里的 InputChannel。
至于中间的怎么做的关联,这里就先不做分析,整个代码比较长,而且对于流程的掌握影响不大。

2.2.5 WindowInputEventReceiver 接受事件并进行分发

在 ViewRootImpl 里有一个 WindowInputEventReceiver 用来接受事件并进行分发。
InputChannel 发送的事件最终都是通过 WindowInputEventReceiver 进行接受。
WindowInputEventReceiver 是在 ViewRootImpl.setView 里面初始化的,setView 的调用是在 ActivityThread.handleResumeActivity -> WindowManagerGlobal.addView。

public void setView(View view, WindowManager.LayoutParams attrs, View panelParentView) {
// …
if (mInputChannel != null) {
if (mInputQueueCallback != null) {
mInputQueue = new InputQueue();
mInputQueueCallback.onInputQueueCreated(mInputQueue);
}
mInputEventReceiver = new WindowInputEventReceiver(mInputChannel,
Looper.myLooper());
}
}

public abstract class InputEventReceiver {
// native 侧代码调用这个方法,把事件派发过来
private void dispatchInputEvent(int seq, InputEvent event, int displayId) {
mSeqMap.put(event.getSequenceNumber(), seq);
onInp

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值