Android系统--输入系统(十二)Dispatch线程_总体框架

Android系统--输入系统(十二)Dispatch线程_总体框架

1. Dispatch线程框架

我们知道Dispatch线程是分发之意,那么便可以引入两个问题:1. 发什么;2. 发给谁。这两个问题便是构成Dispatch线程的主要两个部分,也是今天博文主要讨论的问题,本次只是简单介绍框架,具体介绍会在后续博文具体说明。

2. Dispatch线程分发过程

2.1 针对发什么?
首先需获得事件:

(1)简单处理

  • 进行输入事件分类(Global按键、system按键、用户按键)
  • 处理紧急事件(比如来电静音,按音量键静音)

(2)InputReader线程将处理之后的输入事件放入mInboundQueue队列(属于Dispatch线程)中。

Dispatch线程对事件稍加处理

(3)Dispatch线程获得InputReader线程说发送的事件之后也进行稍加处理:

  • 对于Global按键、system按键,不需要发送给应用程序,直接处理,也是放入一个队列,即mCommandQueue队列。
  • User按键,查找到目标APP,得到联系(connection)。然后将该输入事件放入获得联系(connection)的队列中,即outboundqueue队列。

    对于联系(connection)补充说明:Android系统中,Dispatch线程与众多APP密切联系,当我们创建一个APP时候,便于Dispatch线程产生联系,这些联系由窗口管理器(WindowManager)创建的。故Dispatch线程便可通过这些联系将输入事件发送给对应的APP。
2.2 针对发给谁?
Dispatch线程发送给APP

(4)从outboundQueue队列中取出数据,并通过之前建立好的联系(connection)发给APP。

3. Dispatch线程分发示意图

注:转自https://home.cnblogs.com/u/samchen2009漫天尘沙的图解Android - Android GUI 系统 (5) - Android的Event Input System一文,感谢这位超级大牛的总结,但是有一丢丢小错误,在之后的博文会具体改正说明。
  • InputDispatcher 是一个异步系统,里面用到3个Queue(队列)来保存中间任务和事件,分别是 mInBoundQueue, mOutBoundQueue,mWaitQueue不同队列的进出划分了按键的不同处理阶段。
  • InputReader 采集的输入实现首先经过InterceptBeforeQueuing处理,Android 系统会将这些按键分类(System/Global/User), 这个过程是在InputReader线程里完成。
  • 如果是Motion Event, filterEvent()可能会将其转换成其他的Event。然后通过InjectKeyEvent 将这个按键发给InputDispatcher。这个过程是在System Process的ServerThread里完成。
  • 在进入mOutBoundQueue 之前,首先要经过 interceptBeforeDispatching() 的处理,System 和 Global 事件会在这个处理,而不会发送给用户程序。
  • 通过之前生成的Socket Pair, InputPublish 将 Event发送给当前焦点窗口,然后InputDispatcher将Event放入mWaitQueue 等待窗口的回复。
  • 如果窗口回复,该对象被移出mWaitQueue, 一轮事件处理结束。如果窗口没有处理该事件,从kcm文件里搜寻Fallback 按键,如果有,则重新发送一个新的事件给用户。
  • 如果超过5s没有收到用户回复,则说明用户窗口出现阻塞,InputDispather 会通过Input Manager Service发送ANR给ActivityManager。

Android系统--输入系统(十二)Dispatch线程_总体框架

4.Dispatch线程类调用时序图

如果有读者感兴趣验证该框架,可以根据下图时序图通过阅读源码了解验证上述框架。
注:感谢韦东山老师所画的时序图,使得阅读Android源码事半功倍。

Android系统--输入系统(十二)Dispatch线程_总体框架

上一篇:.net基础系列


下一篇:JPA关系映射之one-to-many和many-to-one