由浅入深学习android input系统(一) - input事件如何传递到View

由浅入深学习android input系统(一) - input事件如何传递到View,第1张

概述概述”View的事件分发“对于大多数android开发者而言都是比较熟悉的。对此还不了解的读者,推荐看下笔者的相关文章:完全理解android事件分发机制那么这个事件究竟是如何从“触摸屏幕”到“View处理事件”的呢?本系列将针对此疑问展开。ViewRootImpl对事件的传递View的 概述

”VIEw的事件分发“对于大多数androID开发者而言都是比较熟悉的。

对此还不了解的读者,推荐看下笔者的相关文章:
完全理解android事件分发机制

那么这个事件究竟是如何从“触摸屏幕”到“VIEw处理事件”的呢?
本系列将针对此疑问展开。

VIEwRootImpl对事件的传递

VIEw的所有更新UI的 *** 作最终都必须经过 *** 作系统在系统进程的处理,才能够通过硬件展示到用户面前。
VIEwRootImpl担任了window与vIEw的中间人的角色,VIEw可以通过VIEwRootImpl将更新UI的 *** 作告知 *** 作系统,而 *** 作系统也可以将触摸等硬件层面 *** 作通过VIEwRootImpl反馈给VIEw。

此块内容笔者专门写文章讲解过,对细节有兴趣的读者可以看下这篇文章:
ViewRootImpl源码解析 (一) - View的更新
ViewRootImpl源码解析 (二) - 事件分发

VIEwRootImpl为起点的传递过程

VIEwRootImpl.WindowinputEventReceiver.oninputEvent()是事件第一次传递到VIEwRootImpl,随后通过一系列的处理可以传递到对应的VIEw。
任务栈调用如下:

VIEwRootImpl.WindowinputEventReceiver.oninputEvent()VIEwRootImpl.enqueueinputEvent()VIEwRootImpl.doProcessinputEvents()VIEwRootImpl.deliverinputEvent()VIEwPostImeinputStage.deliver()VIEwPostImeinputStage.onProcess()VIEwPostImeinputStage.processpointerEvent()VIEw.dispatchPointerEvent()VIEw.dispatchtouchEvent()VIEwRootImpl的事件从哪里来?

app进程在接受到系统进程的事件后,最终会传递给VIEwRootImpl。

任务栈调用如下:

NativeinputEventReceiver.handleEvent()NativeinputEventReceiver.consumeEvents()inputEventReceiver.dispachinputEvent()
(等同于VIEwRootImpl.WindowinputEventReceiver.dispachinputEvent())VIEwRootImpl.WindowinputEventReceiver.oninput()

逻辑如下:

NativeinputEventReceiver监听系统进程发来的事件,收到后就会在handleEvent方法中处理。在NativeinputEventReceiver的consumeEvents()方法中会通过JNI调用到inputEventReceiver的dispachinputEvent()方法。而此处的inputEventReceiver实际上是它的子类VIEwRootImpl.WindowinputEventReceiver。在VIEwRootImpl.WindowinputEventReceiver的dispachinputEvent()方法中,最终会调用到oninput()方法。VIEwRootImpl.WindowinputEventReceiver的dispachinputEvent().oninput()方法就是上面说的VIEwRootImpl的事件分发的入口。后面就会在VIEwRootImpl中传给VIEw。事件监听初始化

任务栈如下:

VIEwRootImpl.setVIEw()WindowinputEventReceiver构造函数WindowinputEventReceiver父类inputEventReceiver构造函数inputEventReceiver.nativeInit()androID_vIEw_inputEventReceiver.nativeInit()NativeinputEventReceiver.initialize()NativeinputEventReceiver.setFdEvents()Looper.addFd()

逻辑如下:

VIEwRootImpl在setVIEw()中初始化WindowinputEventReceiver,WindowinputEventReceiver的构造函数会调用到inputEventReceiver.nativeInit()方法。inputEventReceiver.nativeInit()是native方法,因此直接走到JNI的逻辑中,调用到androID_vIEw.inputEventReceiver.nativeInit()。nativeInit()中初始化了NativeinputEventReceiver,并且调用了NativeinputEventReceiver的initialize()方法。NativeinputEventReceiver的initialize()方法中调用了setFdEvents(),其中通过调用Looper.addFd()方法,对这条链路的事件进行随时监听。Looper中一旦收到事件,最终就会调用到NativeinputEventReceiver.handleEvent()方法。
即上面分析”VIEwRootImpl的事件从哪里来?“的入口。 总结

以上是内存溢出为你收集整理的由浅入深学习android input系统(一) - input事件如何传递到View全部内容,希望文章能够帮你解决由浅入深学习android input系统(一) - input事件如何传递到View所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1003049.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存