Android输入事件InputReader和InputDispatcher分析
2023-09-14 09:09:54 时间
输入事件分发流程:
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...");
}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
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
相关文章
- python线程间通信的方式_android 线程间通信
- 2019最新Android面试题「建议收藏」
- Android native层实现MediaCodec编码H264/HEVC
- android app 退出功能,Android 完美退出 App (Exit)
- android退出app代码,Android应用退出代码各种方式
- 测试android sdk是否安装成功,配置Android SDK
- android .dex文件探究
- 深入理解Android图形系统
- android线程间通信的几种方法_Android进程间和线程间通信方式
- android 底部标签栏CommonTabLayout搭建项目底部菜单(带消息提醒)
- 【Android NDK 开发】JNI 方法解析 ( C/C++ 调用 Java 方法 | 函数签名 | 调用对象方法 | 调用静态方法 )
- 【Android 事件分发】MotionEvent.ACTION_DOWN 按下事件分发流程( Activity | ViewGroup | View )
- 【Android Gradle 插件】TestOptions 配置 ① ( BaseExtension#testOptions 配置 | TestOptions 配置简介 )
- 【Android UI】Paint Gradient 渐变渲染 ① ( LinearGradient 线性渐变渲染 | 设置渲染方向 | 设置渲染颜色 | 设置渲染模式 | MIRROR )
- Android获得WIFI IP地址或者手机网络IP详解编程语言
- 非常实用的Android Studio快捷键详解编程语言
- UC浏览器v10.2.0.535下载|UC Android浏览器 去广告版
- 谷歌 Jetpack Compose 1.0 正式发布:打造原生 UI 的 Android 现代工具包
- android版本检测Android程序的版本检测与更新实现介绍
- Android键盘显示与隐藏代码
- Android中的android:layout_weight使用详解
- java批量采集豌豆荚网站Android应用图标和包名
- Android实现动态显示或隐藏密码输入框的内容