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 里创建了一个线程,作为事件

中转线程,它循环的读取事件,然后把事件放入事件队列里。 代码片段:

  1. ThreadmThread=newThread("InputDeviceReader"){
  2. publicvoidrun(){
  3. android.os.Process.setThreadPriority(
  4. android.os.Process.THREAD_PRIORITY_URGENT_DISPLAY);
  5. try{
  6. RawInputEventev=newRawInputEvent();
  7. while(true){
  8. InputDevicedi;
  9. readEvent(ev);
  10. send=preprocessEvent(di,ev);
  11. addLocked(di,curTime,ev.flags,...,me);
  12. }
  13. }
  14. };

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(键码与键值转换)


更多相关文章

  1. android hover监控鼠标移动事件
  2. Android非主线程更新UI
  3. Android按钮事件响应顺序
  4. android.os.NetworkOnMainThreadException
  5. Android第九课 Toast 用法注意事项
  6. 【Android(安卓)View】Android中View对触摸事件的处理和传递disp
  7. Android(安卓)3.0 r1 API中文文档(113) ——SlidingDrawer
  8. android xml文件解析
  9. Android(安卓)中文 API (101) —— AsyncTask

随机推荐

  1. c++换行符有哪些
  2. c++如何实现字符串分割函数split?(代码示例
  3. c语言是一种什么编译形式的语言
  4. 深入了解数组、List和ArrayList的区别
  5. c++怎么运行
  6. 浅谈C#方法的六种参数
  7. C#之正则表达式介绍
  8. 数据结构排序算法总结
  9. c语言“或”符号
  10. extern c作用