Android输入事件InputReader和InputDispatcher分析
输入事件分发流程:
1.InputReader 线程通过 EventHub 监听 /dev/input 内的文件
2.InputReader 得到输入事件,封装后存入 InputDispatcher 的队列
3.唤醒 InputDispatcher
4.InputDispatcher 取出输入事件,并传递给 Window
<1>.C++层
frameworks/native/services/inputflinger/InputDispatcher.cpp
KeyEvent event;
event.initialize(args->deviceId, args->source, args->action,flags, keyCode, args->scanCode, metaState, 0 /*repeatCount默认值为:0;修改值的可以逻辑在java里/,args->downTime, args->eventTime);
void InputDispatcher::notifyKey(const NotifyKeyArgs* args) {
mPolicy->interceptKeyBeforeQueueing(&event, /*byref*/ policyFlags);
}
<2>.JNI层
frameworks/base/services/core/jni/com_android_server_input_InputManagerService.cpp
void NativeInputManager::interceptMotionBeforeQueueing(nsecs_t when, uint32_t& policyFlags){
env->CallIntMethod(mServiceObj,gServiceClassInfo.interceptKeyBeforeQueueing/*对应java层*/,keyEventObj, policyFlags);
}
<3>java层
frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
public int interceptKeyBeforeQueueing(KeyEvent event, int policyFlags) {
case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE:{
result &= ~ACTION_PASS_TO_USER; //no return app
Log.e(TAG,"KeyCode = " + String.valueOf(event.getKeyCode()) + " action = " + String.valueOf(event.getAction()));
if(!down){
Log.d(TAG,"DownTime = "+ String.valueOf(event.getDownTime())+ "EventTime = " + String.valueOf(event.getEventTime()));
p
if((event.getEventTime() - event.getDownTime()) >= 3000) { //按键大于3s
Intent mIntent = new Intent();
mIntent.putExtra("blue_receive","start");
mIntent.setAction("com.test");
Log.e(TAG,"send broading...");
mContext.sendBroadcast(mIntent,null);
Log.e(TAG,"Time > 3s");
}else{
Log.e(TAG,"Time < 3s");
}
}
break;
}
}
参考:http://blog.csdn.NET/u010122827/article/category/5944877
http://andevele.com/2016/07/07/keypad_first/
http://blog.csdn.net/u012439416/article/details/54605998
Android输入事件InputReader和InputDispatcher分析相关推荐
- Android input 系统InputReader,InputDispatcher线程实例--UI死掉
Android input 系统InputReader,InputDispatcher线程实例–UI死掉但touch 正常报点 依据 Android input 系统初始化和启动流程中的背景: 做An ...
- Android 输入事件一撸到底之View接盘侠(3)
前言 系列文章 1.Android 输入事件一撸到底之源头活水(1) 2.Android 输入事件一撸到底之DecorView拦路虎(2) 3.Android 输入事件一撸到底之View接盘侠(3 前 ...
- Android输入事件从读取到分发三:InputDispatcherThread线程分发事件的过程
分析完事件的读取后,东忙西忙,不知不觉已过去了快五个月了-也不是说没有时间把这部分源码分析完,而是实在是分析不下去,因此转战到其他地方去了.然而这一块始终是心头那不舍的惦记,经过一段时间的沉淀,又参考 ...
- Android输入事件从读取到分发四:InputDispatcherThread发送事件到View结构树的过程
通过上一节的分析,我们发现InputDispatcherThread使用InputChannel的sendMessage方法发送了一条消息,但是我们不知道谁在接收这条消息.因此,这一节我们的目标很明确 ...
- Android Touch事件原理加实例分析
Android中有各种各样的事件,以响应用户的操作.这些事件可以分为按键事件和触屏事件.而Touch事件是触屏事件的基础事件,在进行Android开发时经常会用到,所以非常有必要深入理解它的原理机制. ...
- Android Touch事件分发(源码分析)
Android一文让你轻松搞定Touch事件分发 源码分析 下面,咱们一起通过源码,全面解析事件分发机制,即按顺序讲解: Activity事件分发机制 ViewGroup事件分发机制 View事件分发 ...
- Android输入系统(三)InputReader的加工类型和InputDispatcher的分发过程
关联系列 解析WMS系列 深入理解JNI系列 输入系统系列 前言 在上一篇文章中,我们学习了输入事件的处理,输入事件会交由InputDispatcher进行分发,那么InputDispatcher是如 ...
- Android 系统(57)---深入理解Android输入系统
<深入理解Android 卷III>第五章 深入理解Android输入系统 <深入理解Android 卷III>即将发布,作者是张大伟.此书填补了深入理解Android Fra ...
- 为了讲清楚Android触摸事件,我“拆了部手机”
Android 是一个有用户界面(GUI)的操作系统,在它诞生之初,就是为带有触摸屏的手持设备准备的.作为提供给用户最重要的交互方式之一,了解触摸系统是怎么工作的,对于实际的项目开发有着非常大的帮助. ...
最新文章
- 根文件系统构建(Yocto方式)
- python except用法和作用_121个问题答对80%那么恭喜你,Python的高薪工作迟早有你一份...
- SQL 使用总结六(改善数据库性能)
- 切片器可以设置日期格式?_Power BI之相对日期的设置
- spring源码:@Bean注解解析
- 附录B. Design Motivations【设计意图】
- 修改XMAPP中Apache的默认访问的主页
- Linux下php导出excel失败且浏览器报错500
- 橙旗贷受邀参加浦东企联举行的迎新年书法笔会
- 51CTO学院学习心得
- 【前瞻】Nature:2022年7大“颠覆性”技术
- 解决麒麟V10上传文件乱码问题
- 评估回归模型的指标:MSE、RMSE、MAE、R2、偏差和方差
- break与continue--Java基础024
- 机器人李继红_电力设备
- 一步一步教你制作销售业绩分析报告
- 高精度加法------C++
- Chrome插件不翻墙安装、离线安装, 插件商店,Fatkun图片批量下载插件
- delphi 数字转字符串补全
- 分库分表ShardingSphere<四> _ 读写分离