由浅入深学习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事件如何传递到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是什么时候初始化的?

以上是关于由浅入深学习android input系统 - input事件如何传递到app进程( InputDispatcher )的主要内容,如果未能解决你的问题,请参考以下文章

由浅入深学习android input系统 - input系统的启动

由浅入深学习android input系统 - input事件采集(InputReader)

由浅入深学习android input系统 - input事件采集(InputReader)

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

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

由浅入深学习android input系统 - InputChannel解析