android framework 输入事件分析
2012-03-05 23:07
337 查看
本文来自 csdn lidp 转载著名出处。
android事件处理涉及kernel层,硬件抽象层,framework层,
与按键相关的文件主要为:
1. EventHub.cpp (frameworks\base\libs\ui) 按键事件硬件抽象层接口,给framework jni层提供访问硬件接口
2. frameworks\base\core\jni\server\ com_android_server_KeyInputQueue.cpp
访问EventHub.cpp提供的接口获取设备输入事件,给KeyInputQueue.java提供java层接口。
KeyInputQueue.java
在frameworks/base/services/java/com/android/server/KeyInputQueue.java 里创建了一个线程,作为事件
中转线程,它循环的读取事件,然后把事件放入事件队列里。 代码片段:
3. windowmanagerservice.java:
(frameworks/base/services/java/com/android/server/windowmanagerservice.java)
windowmanagerservice.java 启动一个线程作为输入事件分发引擎,此线程从KeyInputQueue.java 事件队列读取输入事件,
然后把事件分发到当前窗口上去。
android中输入事件分为三种,key, trackball and pointer,即按键,滑轮,触摸,所以在分发到窗口上时根据事件类型
调用相应的分发函数,如按键事件调用 focus.mClient.dispatchKey(event);
入口:init->zyogote->SystemServer->windowmanagerservice
systemServer ini2方法中创建java层各种服务,其中包括 WindowManagerService,
创建WindowManagerService 时,构造函数中new KeyQ(); KeyQ继承KeyInputQueue,所以
会创建KeyInputQueue.java中的事件中转线程InputDeviceReader,此线程调用readEvent(ev);
而readEvent(ev);为com_android_server_KeyInputQueue.cpp 提供的方法
android_server_KeyInputQueue_readEvent->getEvent(EventHub.cpp) ,打开input 设备文件,
然后不断poll此文件句柄上的输入事件(POLLIN)。
WindowManagerService() new KeyQ()后又创建事件分发线程,InputDispatcherThread ,此线程
从刚创建的KeyQ 事件队列中读取按键事件,根据事件类型分发到相应控件。
相关源代码位置
/frameworks/base/services/java/com/android/server/WindowManagerService.java(事件分发给最前面的窗口)
/frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java(拦截消息的处理类)
/frameworks/base/core/java/android/view/KeyEvent.java(按键事件定义)
/frameworks/base/services/java/com/android/server/InputManager.Java(Java层输入管理)
/frameworks/base/libs/ui/InputDispatcher.cpp(事件分发线程)
/frameworks/base/libs/ui/EventHub.cpp(键码与键值转换)
参考:
http://hi.baidu.com/zhouhanqing/blog/item/9d18a3cc16020a580eb3451c.html
http://hi.baidu.com/zhouhanqing/blog/item/79ebf6dfac094551cdbf1a1c.html
http://blog.chinaunix.net/space.php?uid=20564848&do=blog&id=73525
http://kcchao.wikidot.com/android-application-framework
android事件处理涉及kernel层,硬件抽象层,framework层,
与按键相关的文件主要为:
1. EventHub.cpp (frameworks\base\libs\ui) 按键事件硬件抽象层接口,给framework jni层提供访问硬件接口
2. frameworks\base\core\jni\server\ com_android_server_KeyInputQueue.cpp
访问EventHub.cpp提供的接口获取设备输入事件,给KeyInputQueue.java提供java层接口。
KeyInputQueue.java
在frameworks/base/services/java/com/android/server/KeyInputQueue.java 里创建了一个线程,作为事件
中转线程,它循环的读取事件,然后把事件放入事件队列里。 代码片段:
Thread mThread = new Thread("InputDeviceReader") { public void run() { android.os.Process.setThreadPriority( android.os.Process.THREAD_PRIORITY_URGENT_DISPLAY); try { RawInputEvent ev = new RawInputEvent(); while (true) { InputDevice di; readEvent(ev); send = preprocessEvent(di, ev); addLocked(di, curTime, ev.flags, ..., me); } } };
3. windowmanagerservice.java:
(frameworks/base/services/java/com/android/server/windowmanagerservice.java)
windowmanagerservice.java 启动一个线程作为输入事件分发引擎,此线程从KeyInputQueue.java 事件队列读取输入事件,
然后把事件分发到当前窗口上去。
android中输入事件分为三种,key, trackball and pointer,即按键,滑轮,触摸,所以在分发到窗口上时根据事件类型
调用相应的分发函数,如按键事件调用 focus.mClient.dispatchKey(event);
入口:init->zyogote->SystemServer->windowmanagerservice
systemServer ini2方法中创建java层各种服务,其中包括 WindowManagerService,
创建WindowManagerService 时,构造函数中new KeyQ(); KeyQ继承KeyInputQueue,所以
会创建KeyInputQueue.java中的事件中转线程InputDeviceReader,此线程调用readEvent(ev);
而readEvent(ev);为com_android_server_KeyInputQueue.cpp 提供的方法
android_server_KeyInputQueue_readEvent->getEvent(EventHub.cpp) ,打开input 设备文件,
然后不断poll此文件句柄上的输入事件(POLLIN)。
WindowManagerService() new KeyQ()后又创建事件分发线程,InputDispatcherThread ,此线程
从刚创建的KeyQ 事件队列中读取按键事件,根据事件类型分发到相应控件。
相关源代码位置
/frameworks/base/services/java/com/android/server/WindowManagerService.java(事件分发给最前面的窗口)
/frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java(拦截消息的处理类)
/frameworks/base/core/java/android/view/KeyEvent.java(按键事件定义)
/frameworks/base/services/java/com/android/server/InputManager.Java(Java层输入管理)
/frameworks/base/libs/ui/InputDispatcher.cpp(事件分发线程)
/frameworks/base/libs/ui/EventHub.cpp(键码与键值转换)
参考:
http://hi.baidu.com/zhouhanqing/blog/item/9d18a3cc16020a580eb3451c.html
http://hi.baidu.com/zhouhanqing/blog/item/79ebf6dfac094551cdbf1a1c.html
http://blog.chinaunix.net/space.php?uid=20564848&do=blog&id=73525
http://kcchao.wikidot.com/android-application-framework
相关文章推荐
- android framework 输入事件分析
- Android输入事件流程中的EventHub分析及源码演示
- Android输入事件InputReader和InputDispatcher分析
- 对“Android输入事件流程中的EventHub分析及源码演示”的补充
- 源码角度分析Android的事件输入系统(input system)及ANR原理分析
- Android事件处理分析+Android事件处理 +Android输入事件流程
- Android4.1手写笔输入、悬浮事件分析
- Android输入事件流程中的EventHub分析及源码演示
- Android事件处理分析+Android事件处理 +Android输入事件流程
- Android4.1手写笔输入、悬浮事件分析
- Android事件处理分析+Android事件处理 +Android输入事件流程
- android源码分析——事件输入流程MotionEvent事件处理流程
- Android输入事件流程中的EventHub分析及源码演示
- Android输入事件流程中的EventHub分析及源码演示
- Android输入事件流程中的EventHub分析及源码演示
- Android开发中onClick事件的几种实现,分析,对比
- Android的事件分发源码分析,告别事件冲突。
- android 应用监听输入法按键事件【比如搜索和回车键等】的整个流程分析
- Android Uevent 分析,从kernel到framework
- Android触摸屏事件派发机制详解与源码分析二(ViewGroup篇)