zoukankan      html  css  js  c++  java
  • 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。

    4.Dispatch线程类调用时序图

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

  • 相关阅读:
    SQL SET NOCOUNT (Transact-SQL)
    Delphi WinAPI DragAcceptFiles、DragQueryFile、DragFinish、DragQueryPoint
    Delphi Thread线程错误:Canvas doesn't allow drawing
    Delphi ADOQuery错误:ADOQuery1:commandtext does not return a result set
    医学-药物-未分类-胃舒平(复方氢氧化铝)
    SQL 查询时间超时已过期(SQL 2000、SQL2005、SQL2008、SQL2012等)
    SQL 数据库引擎语句 sp_executesql 的使用介绍(Transact-SQL)
    android 定位代码
    Centos7开放及查看端口
    非常详细的sklearn介绍
  • 原文地址:https://www.cnblogs.com/lkq1220/p/6820486.html
Copyright © 2011-2022 走看看