• 微信公众号:美女很有趣。 工作之余,放松一下,关注即送10G+美女照片!

由浅入深学习android input系统(二) – input事件如何传递到app进程( InputDispatcher )

互联网 diligentman 2小时前 2次浏览

概述

前文已经解析的内容是:app进程在接收到input事件后,最终传递到View,经过了哪些操作。

前文地址:由浅入深学习android input系统(一) – 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()

逻辑如下:

  1. InputDispatcher的线程通过循环执行dispatchOnce()方法来接收事件。
  2. dispatchOnceInnerLocked()方法中会去判断此次事件是否有效,以及是否需要ANR等。
  3. dispatchKeyLocked()会去查找当前的窗口,如果找到了窗口,并且事件可以传递就会继续往下走。
  4. dispatchEventLocked()中会获取当前的inputChannel,然后将其传入到prepareDispatchCycleLocked()方法中。
  5. prepareDispatchCycleLocked()方法会判断当前的inputChannel是否链接正常,如果不正常就会直接返回。如果很正常就会逻辑继续走。
  6. enqueueDispatchEntriesLocked()会根据分发事件的类型,进行不同的处理后,放入到outboundQueue这个队列中,然后执行后续逻辑。
  7. startDispatchCycleLocked()会从outboundQueue队列中取出已经处理好的事件,通过InputPublisher.publishKeyEvent()将事件发出去。
  8. publishKeyEvent()收到事件后通过InputChannel.sendMessage()将事件发送给app进程中对应的ViewRootImpl。

继续探索

留两个疑问后文探索,有兴趣的读者可以持续关注,或者自行阅读下源码

  1. input事件是怎么从硬件上获取到的?
  2. InputDispatcher是什么时候初始化的?
  3. InputChannel是什么时候初始化的?

喜欢 (0)