Activity的dispatchTouchEvent调用堆栈

在Android应用中,Activity类的dispatchTouchEvent方法和InputEventReceiver的finishInputEvent方法抛出异常。错误定位到MainWbActivity的触摸事件处理,可能涉及视图层次结构和输入事件的处理问题。

 Activity.java的 dispatchTouchEvent
 java.lang.Exception
      at android.app.Activity.dispatchTouchEvent(Activity.java:4122)
      at com.cultraview.whiteboard.view.MainWbActivity.dispatchTouchEvent(MainWbActivity.kt:721)
      at com.android.internal.policy.DecorView.dispatchTouchEvent(DecorView.java:446)
      at android.view.View.dispatchPointerEvent(View.java:14568)
      at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:6022)
      at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:5825)
      at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:5316)
      at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:5373)
      at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:5339)
      at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:5491)
      at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:5347)
      at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:5548)
      at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:5320)
      at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:5373)
      at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:5339)
      at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:5347)
      at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:5320)
      at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:8086)
      at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:8037)
      at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:7998)
      at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:8209)
      at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:221)
      at android.os.MessageQueue.nativePollOnce(Native Method)
      at android.os.MessageQueue.next(MessageQueue.java:335)
      at android.os.Looper.loop(Looper.java:183)
      at android.app.ActivityThread.main(ActivityThread.java:7664)
      at java.lang.reflect.Method.invoke(Native Method)
      at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:952)

InputEventReceiver.java的 finishInputEvent
 java.lang.Exception
      at android.view.InputEventReceiver.finishInputEvent(InputEventReceiver.java:167)
      at android.view.ViewRootImpl.finishInputEvent(ViewRootImpl.java:8115)
      at android.view.ViewRootImpl.access$1900(ViewRootImpl.java:194)
      at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:5375)
      at android.view.ViewRootImpl$SyntheticInputStage.onDeliverToNext(ViewRootImpl.java:6201)
      at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:5339)
      at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:5309)
      at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:5373)
      at android.view.ViewRootImpl$ViewPostImeInputStage.onDeliverToNext(ViewRootImpl.java:5843)
      at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:5339)
      at android.view.ViewRootImpl$InputStage.finish(ViewRootImpl.java:5332)
      at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:5349)
      at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:5320)
      at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:5373)
      at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:5339)
      at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:5491)
      at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:5347)
      at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:5548)
      at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:5320)
      at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:5373)
      at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:5339)
      at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:5347)
      at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:5320)
      at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:8086)
      at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:8037)
      at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:7998)
      at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:8209)
      at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:221)
      at android.os.MessageQueue.nativePollOnce(Native Method)
      at android.os.MessageQueue.next(MessageQueue.java:335)
      at android.os.Looper.loop(Looper.java:183)
      at android.app.ActivityThread.main(ActivityThread.java:7664)
      at java.lang.reflect.Method.invoke(Native Method)
      at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:952)

<think>嗯,用户问的是AOSP中ActivitydispatchTouchEvent是从哪里调用的。首先,我需要回忆一下Android的事件分发机制。ActivitydispatchTouchEvent方法是在处理触摸事件的时候被调用的。那这个方法具体是在哪个流程中被触发的呢?记得Android的事件分发是从系统服务开始的,比如InputManager负责接收输入事件,然后传递给当前的窗口。对于Activity来说,事件应该是从PhoneWindow开始,然后传到DecorView,再分发到各个ViewGroup和View。 那ActivitydispatchTouchEvent方法应该是在接收到触摸事件的时候被调用。具体来说,当一个触摸事件到达应用时,系统会将事件传递给当前的Window,也就是PhoneWindow实例。然后,PhoneWindow会把事件交给DecorView,也就是整个视图层次的根布局。 DecorView在处理事件的时候,会先让Activity有机会处理这个事件。这时候,DecorView会调用ActivitydispatchTouchEvent方法。如果ActivitydispatchTouchEvent返回true,表示事件已经被消费,不再继续传递;如果返回false,事件会继续传递给DecorView的子视图进行处理。 所以,整个流程应该是:InputManager -> WindowManagerService-> PhoneWindow ->DecorView -> Activity.dispatchTouchEvent。 那具体的调用路径是在哪里呢?在AOSP的源码中,DecorView的superDispatchTouchEvent方法可能会调用ActivitydispatchTouchEvent。例如,在Activity的setContentView时创建的DecorView,当事件到来时,会先经过DecorView的dispatchTouchEvent,然后调用ActivitydispatchTouchEvent方法。 可能需要查看相关的源码文件,比如Activity.java和PhoneWindow.java中的相关内容。例如,在Activity中,dispatchTouchEvent的实现是将事件传递给Window,即PhoneWindow的superDispatchTouchEvent方法,而PhoneWindow会进一步调用DecorView的superDispatchTouchEvent,最终触发ViewGroup的事件分发流程。 总结来说,ActivitydispatchTouchEvent是由其内部的Window(即PhoneWindow)调用的,而PhoneWindow又通过DecorView来传递事件。所以当触摸事件到达时,首先由系统传递给PhoneWindow,再由PhoneWindow调用ActivitydispatchTouchEvent方法。</think>在AOSP中,`Activity.dispatchTouchEvent()`的调用链如下: 1. **系统输入事件分发** Android系统的`InputManagerService`将触摸事件发送到当前应用的`WindowManagerService`,最终通过Binder传递到应用进程。 2. **事件传递到PhoneWindow** 应用进程的`ActivityThread`通过`H`消息处理事件,最终调用`Window.Callback`接口(实际为`Activity`实现),触发`Activity.dispatchTouchEvent()`。 3. **关键源码路径** - `Activity.dispatchTouchEvent()`内部会调用`getWindow().superDispatchTouchEvent()`(`getWindow()`返回`PhoneWindow`实例)。 - `PhoneWindow.superDispatchTouchEvent()`进一步调用`mDecor.superDispatchTouchEvent()`(`mDecor`为`DecorView`实例)。 - `DecorView.superDispatchTouchEvent()`最终将事件分发到`ViewGroup.dispatchTouchEvent()`,进入常规视图层级分发流程。 ```java // Activity.java @Override public boolean dispatchTouchEvent(MotionEvent ev) { if (ev.getAction() == MotionEvent.ACTION_DOWN) { onUserInteraction(); } if (getWindow().superDispatchTouchEvent(ev)) { return true; } return onTouchEvent(ev); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值