”VIEw的事件分发“对于大多数androID开发者而言都是比较熟悉的。
对此还不了解的读者,推荐看下笔者的相关文章:
完全理解android事件分发机制
那么这个事件究竟是如何从“触摸屏幕”到“VIEw处理事件”的呢?
本系列将针对此疑问展开。
VIEw的所有更新UI的 *** 作最终都必须经过 *** 作系统在系统进程的处理,才能够通过硬件展示到用户面前。
VIEwRootImpl担任了window与vIEw的中间人的角色,VIEw可以通过VIEwRootImpl将更新UI的 *** 作告知 *** 作系统,而 *** 作系统也可以将触摸等硬件层面 *** 作通过VIEwRootImpl反馈给VIEw。
VIEwRootImpl为起点的传递过程此块内容笔者专门写文章讲解过,对细节有兴趣的读者可以看下这篇文章:
ViewRootImpl源码解析 (一) - View的更新
ViewRootImpl源码解析 (二) - 事件分发
VIEwRootImpl.WindowinputEventReceiver.oninputEvent()是事件第一次传递到VIEwRootImpl,随后通过一系列的处理可以传递到对应的VIEw。
任务栈调用如下:
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所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)