Android系统--输入系统(十三)Dispatcher线程情景分析_Reader线程传递事件
Android系统--输入系统(十三)Dispatcher线程情景分析_Reader线程传递事件
1. 输入按键
我们知道Android系统的按键分为三类:(1)Global Key;(2)System Key;(3)User Key
Global Key:按下一个按键,启动某个APP。 具体使用哪个按键启动哪个APP可以自己指定,修改\frameworks\base\core\res\res\xml\Global_keys.xml,接下来有一篇博文具实现,假设它是AKEYCODE_TV
System Key:比如音量键(AKEYCODE_VOLUME_DOWN)
User Key:其他按键,比如ABCD(AKEYCODE_A)
2. 回顾
2.1 概述
Reader线程把驱动上报的scancode根据.kl文件转化为keycode,Dispatch线程根据所获得keycode进行处理。Android Dispatch线程对这三类按键的处理
* Global Key
* System Key
* User Key
2.2 具体处理流程
- Reader线程将输入事件稍作处理
- Reader线程会将输入事件放入mInBoundQueue队列中
- Dispatch线程将从mInBoundQueue队列中取出输入事件,稍作处理
- 再将处理后的输入事件放入mOutBoundQueue队列
- 最后再从mOutBoundQueue队列中取出来,发给目的应用
3. 阅读源码分析三种按键的处理过程
之前已经分析了Reader线程从驱动程序得到扫描码之后,根据.KL文件,得到对应的按键码,然后构造args参数,接着使用NotifiyKey将该参数告诉Reader线程的Listener,而Reader线程的监听者肯定为Dispatch线程,要想验证,可以通过源代码分析得出。
3.1 Golbal Key分析
1. Reader线程获得他的Listener,调用notifykey做进一步的处理
InputReader.cpp
NotifyKeyArgs args(when, getDeviceId(), mSource, policyFlags,
down ? AKEY_EVENT_ACTION_DOWN : AKEY_EVENT_ACTION_UP,
AKEY_EVENT_FLAG_FROM_SYSTEM, keyCode, scanCode, newMetaState, downTime);
getListener()->notifyKey(&args);
}
2. 放入队列之前,稍作处理
2.1 调用Java里面PhoneWindowManager的同名函数
2.2 根据返回值设置policeFlags,对于global按键直接返回Pass_To_User
InputDispatch.cpp
//policyFlasgs接收函数的输出结果,根据policyFlags构造newEntry,将newEntry放入队列中
mPolicy->interceptKeyBeforeQueueing(&event, /*byref*/ policyFlags);
3. 放入mInboundQueue队列
InputDispatch.cpp
needWake = enqueueInboundEventLocked(newEntry);
4. 必要时候唤醒Dispatch线程
InputDispatch.cpp
if (needWake) {
mLooper->wake();
}
3.2 System Key分析
1. Reader线程获得他的Listener,调用notifykey做进一步的处理
InputReader.cpp
NotifyKeyArgs args(when, getDeviceId(), mSource, policyFlags,
down ? AKEY_EVENT_ACTION_DOWN : AKEY_EVENT_ACTION_UP,
AKEY_EVENT_FLAG_FROM_SYSTEM, keyCode, scanCode, newMetaState, downTime);
getListener()->notifyKey(&args);
}
2. 放入队列之前,稍作处理
2.1 调用Java里面PhoneWindowManager的同名函数,分类处理
- 可以处理的紧急事件,处理他,设置返回值为:!Pass_to_user
- 返回pass_to_user
InputDispatch.cpp
//policyFlasgs接收函数的输出结果,根据policyFlags构造newEntry,将newEntry放入队列中
mPolicy->interceptKeyBeforeQueueing(&event, /*byref*/ policyFlags);
3. 放入mInboundQueue队列
InputDispatch.cpp
needWake = enqueueInboundEventLocked(newEntry);
4. 必要时候唤醒Dispatch线程
InputDispatch.cpp
if (needWake) {
mLooper->wake();
}
3.3 User Key分析
1. Reader线程获得他的Listener,调用notifykey做进一步的处理
InputReader.cpp
NotifyKeyArgs args(when, getDeviceId(), mSource, policyFlags,
down ? AKEY_EVENT_ACTION_DOWN : AKEY_EVENT_ACTION_UP,
AKEY_EVENT_FLAG_FROM_SYSTEM, keyCode, scanCode, newMetaState, downTime);
getListener()->notifyKey(&args);
}
2. 放入队列之前,稍作处理
2.1 调用Java里面PhoneWindowManager的同名函数
2.2 根据返回值设置policyFlags,对于用户按键直接返回Pass_To_User
InputDispatch.cpp
//policyFlasgs接收函数的输出结果,根据policyFlags构造newEntry,将newEntry放入队列中
mPolicy->interceptKeyBeforeQueueing(&event, /*byref*/ policyFlags);
3. 放入mInboundQueue队列
InputDispatch.cpp
needWake = enqueueInboundEventLocked(newEntry);
4. 必要时候唤醒Dispatch线程
InputDispatch.cpp
if (needWake) {
mLooper->wake();
}
4. DIspatch流程修订图
从上文分析可知,不论是否Pass_to_user,最终都要放入到队列mInboundQueue当中去,上篇博客总结的流程图有点错误,故进行修改,具体如下图。

Android系统--输入系统(十三)Dispatcher线程情景分析_Reader线程传递事件的更多相关文章
- 10.7 android输入系统_Dispatcher线程情景分析_Reader线程传递事件和dispatch前处理
android输入系统C++最上层文件是com_android_serve_input_InputManagerService.cpp global key:按下按键,启动某个APP可以自己指定,修改 ...
- Android系统--输入系统(十四)Dispatcher线程情景分析_dispatch前处理
Android系统--输入系统(十四)Dispatcher线程情景分析_dispatch前处理 1. 回顾 我们知道Android输入系统是Reader线程通过驱动程序得到上报的输入事件,还要经过处理 ...
- Android系统--输入系统(十七)Dispatcher线程_分发dispatch
Android系统--输入系统(十七)Dispatcher线程_分发dispatch 1. 回顾 InputRead线程从输入设备当中得到输入事件 对于读到输入事件稍作处理,比如紧急事件,来电时候按下 ...
- 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线程核心类--EventHub 1.1 Reader线程核心结构体 实例化对象:mEventHub--表示多个 ...
- Android系统--输入系统(十)Reader线程_核心类及配置文件深入分析
Android系统--输入系统(十)Reader线程_核心类及配置文件深入分析 0. 前言 个人认为该知识点阅读Android源代码会不仅容易走进死胡同,并且效果并不好,前脚看完后脚忘记,故进行总结, ...
- Android系统--输入系统(十一)Reader线程_简单处理
Android系统--输入系统(十一)Reader线程_简单处理 1. 引入 Reader线程主要负责三件事情 获得输入事件 简单处理 上传给Dispatch线程 InputReader.cpp vo ...
- Android系统--输入系统(十二)Dispatch线程_总体框架
Android系统--输入系统(十二)Dispatch线程_总体框架 1. Dispatch线程框架 我们知道Dispatch线程是分发之意,那么便可以引入两个问题:1. 发什么;2. 发给谁.这两个 ...
随机推荐
- Dubbo工程结构和Maven打包
Dubbo 工程结构 待续 Dubbo pom版本设置 在升级Dubbo的pom版本时需要对每一个工程中子工程pom,子子工程pom进行修改,这是一个复杂繁琐的工作.为此有人手动一个个修改,好一点的用 ...
- PHP开发微信模版消息换行的问题
微信是个坑!微信是个坑!微信是个坑!重要的时间说三遍 关键的地方是空白换行符到底是什么也不说,百度说是"\n":但是在发送消息的时候发现原样输出,发现json_encode对\n进 ...
- Submin1安装记录(CentOS5)
安装SVN和Apache wget http://opensource.wandisco.com/RPM-GPG-KEY-WANdisco -O /tmp/RPM-GPG-KEY-WANdisco & ...
- 观《IT培训行业揭秘》触发北大青鸟回忆
在园子里看到这篇文章<IT培训行业解密(六)>时,挺有感触,回忆顿时涌上心头: 我想起了当年单纯的我们因为各自的原因来到北大青鸟,或因前途迷茫而选择想找一条出路,或因父母的信息闭塞而想给我 ...
- react router 4.0以上的路由应用
thead>tr>th{padding:8px;line-height:1.4285714;border-top:1px solid #ddd}.table>thead>tr& ...
- Web开发安全小贴士
想要开发出一个安全的.健壮的Web应用其实是非常困难的, 如果你想要快速开发出一款集使用价值.用户体验度.以及安全性为一身的产品,以下安全步骤很必要!!! 数据库 1.对类似访问令牌.电子邮箱 ...
- PHP数组简介
一.PHP数组的分类 按照下标的不同,PHP中的数组分为关联数组和索引数组:索引数组:下标从0开始,依次增长. $arr=[1,2,3,4,5]; 关联数组:下标为字符串格式,每个下标字符串与数组的值 ...
- 搭建rtmp直播流服务之4:videojs和ckPlayer开源播放器二次开发(播放rtmp、hls直播流及普通视频)
前面几章讲解了使用 nginx-rtmp搭建直播流媒体服务器; ffmpeg推流到nginx-rtmp服务器; java通过命令行调用ffmpeg实现推流服务; 从数据源获取,到使用ffmpeg推流, ...
- robot framework环境搭建
来源:http://www.cnblogs.com/puresoul/p/3854963.html[转] 一. robot framework环境搭建: 官网:http://robotframewor ...
- 【PHP】最详细PHP从入门到精通(三)——PHP中的数组常用函数汇总
PHP从入门到精通 之PHP中的数组常用函数详解 数组作为PHP中最常用的结构之一,PHP强大的数组函数功能,给数组的相关操作带来了极大的便利.今天给大家介绍的PHP中数组函数,是PHP数组中重要的 ...