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源码事半功倍。
Android系统--输入系统(十二)Dispatch线程_总体框架的更多相关文章
- 10.6 android输入系统_Dispatcher线程_总体框架
图解Android - Android GUI 系统 (5) - Android的Event Input System - 漫天尘沙 - 博客园.htm // 关注里面的Dispatcher处理流程h ...
- Android学习笔记(十二) 线程
Android中的线程和Java中的线程使用方法类似,参考(四)Java基础知识回顾 MainThread与WorkerThread UI相关的线程都运行在主线程(MainThread/UIThrea ...
- Android系统--输入系统(十四)Dispatcher线程情景分析_dispatch前处理
Android系统--输入系统(十四)Dispatcher线程情景分析_dispatch前处理 1. 回顾 我们知道Android输入系统是Reader线程通过驱动程序得到上报的输入事件,还要经过处理 ...
- Android系统--输入系统(十)Reader线程_核心类及配置文件深入分析
Android系统--输入系统(十)Reader线程_核心类及配置文件深入分析 0. 前言 个人认为该知识点阅读Android源代码会不仅容易走进死胡同,并且效果并不好,前脚看完后脚忘记,故进行总结, ...
- Android系统--输入系统(十七)Dispatcher线程_分发dispatch
Android系统--输入系统(十七)Dispatcher线程_分发dispatch 1. 回顾 InputRead线程从输入设备当中得到输入事件 对于读到输入事件稍作处理,比如紧急事件,来电时候按下 ...
- Android系统--输入系统(十六)APP跟输入系统建立联系_InputChannel和Connection
Android系统--输入系统(十六)APP跟输入系统建立联系_InputChannel和Connection 0. 核心:socketpair机制 1. 回顾Dispatch处理过程: 1.1 放入 ...
- Android系统--输入系统(七)Reader_Dispatcher线程启动分析
Android系统--输入系统(七)Reader_Dispatcher线程启动分析 1. Reader/Dispatcher的引入 对于输入系统来说,将会创建两个线程: Reader线程(读取事件) ...
- Android系统--输入系统(八)Reader线程_使用EventHub读取事件
Android系统--输入系统(八)Reader线程_使用EventHub读取事件 1. Reader线程工作流程 获得事件 size_t count = mEventHub->getEvent ...
- Android系统--输入系统(十一)Reader线程_简单处理
Android系统--输入系统(十一)Reader线程_简单处理 1. 引入 Reader线程主要负责三件事情 获得输入事件 简单处理 上传给Dispatch线程 InputReader.cpp vo ...
随机推荐
- 用shell实现linux系统应用文件清理工具
用shell实现linux系统文件清理工具 1:原始需求 在系统运维中,会产生大量应用备份文件.落地文件等,这些文件需要定时清理.一般来说,都是使用crontab 拉起一个脚本来清理.类似这样: 30 ...
- Ioc在重构代码中的应用
最近lz在写抓工商公式系统(http://www.gsxt.gov.cn/index.html)的爬虫,其中的难点就是在怎么过极验验证码,搞的我不要不要的!如下: 简直是各种坑,被搞的死去活来以后还是 ...
- 功能总结之MongDB初探
题外话 工作3年,了解的技术颇多,但都是一知半解,了解不是很透澈.用过的技术,就像猴子搬过的包谷,搬一个丢一个.几年风雨,真有点一缕清风过,片叶不沾身的味道. 为强化知识点,提升文档及学习能力,我把以 ...
- 找回mysql数据库root用户的密码
- Omi架构与React Fiber
原文链接-https://github.com/AlloyTeam/omi/tree/master/tutorial 写在前面 Omi框架在架构设计的时候就决定把update的控制权交给了开发者,视灵 ...
- js 获取元素内部文本
调用textContent属性即可. 如: var label=document.getElementById('juan-select').getElementsByClassName('radio ...
- ROS多机通信计算机网络配置
以实现master和nico的互联共享信息为例 1 查看IP地址 $ifconfig 查看ip地址 可以看到 master的IP为192.168.1.10 nico的IP为192.168.1.103 ...
- Shell第三篇:基本语法
一 什么是shell script 将OS命令堆积到可执行的文件里,由上至下的顺序执行文本里的OS命令 就是脚本了. 再加上些智能(条件/流控)控制,就变成了智能化脚本了. 二 变量 part1 为何 ...
- Java并发编程:Semaphore、CountDownLatch、CyclicBarrier
首先我们来实现一个功能:当我们启动一个系统的时候需要初始化许多数据,这时候我们可能需要启动很多线程来进行数据的初始化,只有这些系统初始化结束之后才能够启动系统.其实在Java的类库中已经提供了Sema ...
- 在app中屏蔽第三方键盘
iOS8开放了安装第三方键盘的权限,但是在项目开发中,有些情况是需要禁用第三方键盘的.比如说,数字键盘上需要自定义按钮,但是在第三方键盘弹出时,按钮就覆盖在这上面了,在这中情况下,最好的办法是禁用第三 ...