由浅入深学习android input系统 - input事件如何传递到app进程( InputDispatcher )
Posted 许佳佳233
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了由浅入深学习android input系统 - input事件如何传递到app进程( InputDispatcher )相关的知识,希望对你有一定的参考价值。
android input系列文章
由浅入深学习android input系统(一) - input事件如何传递到View
由浅入深学习android input系统(二) - input事件如何传递到app进程( InputDispatcher )
由浅入深学习android input系统(三) - InputChannel解析
由浅入深学习android input系统(四) - input事件采集(InputReader)
由浅入深学习android input系统(五) - input系统的启动
概述
前文已经解析的内容是:app进程在接收到input事件后,最终传递到View,经过了哪些操作。
本文将继续探索 android input系统,分析下系统进程是怎么将input事件传递到app进程的。
InputDispatcher的事件分发
系统进程的input事件都通过InputDispatcher这个类来进行分发。比如当有触摸事件发送过来时,InputDispatcher会对其进行判断来分发给哪个进程,哪个window。
调用任务栈如下:
- InputDispatcher.dispatchOnce()
- InputDispatcher.dispatchOnceInnerLocked()
- InputDispatcher.dispatchKeyLocked()
- InputDispatcher.dispatchEventLocked()
- InputDispatcher.prepareDispatchCycleLocked()
- InputDispatcher.enqueueDispatchEntriesLocked()
- InputDispatcher.startDispatchCycleLocked()
- InputPublisher.publishKeyEvent()
- InputChannel.sendMessage()
逻辑如下:
- InputDispatcher的线程通过循环执行dispatchOnce()方法来接收事件。
- dispatchOnceInnerLocked()方法中会去判断此次事件是否有效,以及是否需要ANR等。
- dispatchKeyLocked()会去查找当前的窗口,如果找到了窗口,并且事件可以传递就会继续往下走。
- dispatchEventLocked()中会获取当前的inputChannel,然后将其传入到prepareDispatchCycleLocked()方法中。
- prepareDispatchCycleLocked()方法会判断当前的inputChannel是否链接正常,如果不正常就会直接返回。如果很正常就会逻辑继续走。
- enqueueDispatchEntriesLocked()会根据分发事件的类型,进行不同的处理后,放入到outboundQueue这个队列中,然后执行后续逻辑。
- startDispatchCycleLocked()会从outboundQueue队列中取出已经处理好的事件,通过InputPublisher.publishKeyEvent()将事件发出去。
- publishKeyEvent()收到事件后通过InputChannel.sendMessage()将事件发送给app进程中对应的ViewRootImpl。
继续探索
留两个疑问后文探索,有兴趣的读者可以持续关注,或者自行阅读下源码:
- input事件是怎么从硬件上获取到的?
- InputDispatcher是什么时候初始化的?
- InputChannel是什么时候初始化的?
以上是关于由浅入深学习android input系统 - input事件如何传递到app进程( InputDispatcher )的主要内容,如果未能解决你的问题,请参考以下文章
由浅入深学习android input系统 - input系统的启动
由浅入深学习android input系统 - input事件采集(InputReader)
由浅入深学习android input系统 - input事件采集(InputReader)
由浅入深学习android input系统 - input事件如何传递到View