Android中按键消息的派发过程及源码分析


Android中消息的整体派发过程:接收消息——消息处理前端——窗口管理系统派发消息——窗口进行消息处理

以上过程中前三步都在WmS中完成,按键消息直接发送给当前窗口,而触摸消息则根据触摸坐标位置来匹配所有窗口,并判断坐标落到哪个窗口区域中,然后把消息发送给相应的窗口。对于按键消息还会涉及到“生理长按”的检测,比如一直按住某个键,那么会产生一些列的按键消息,然而第1个和第2个消息之间往往会间隔较长的时间,这种设计是人类本身的生理特点决定的,因为从按下到弹起的过程中,如果CPU处理太快,会导致产生多次该消息,这往往不是用户所期望的,因此Android把这种消息处理延迟加入到了消息处理前端中,应用程序不需要关心第一次的延迟,只需按普通的DOWN消息处理。

下面具体分析Android中按键消息的派发流程:

每个窗口定义了一个ViewRoot(4.0中是ViewRootImpl)对象,而ViewRoot对象中定义了一个inputHandler,窗口管理系统(WmS)派发消息的过程中会调用inputHandler的handlekey(),该函数再调用ViewRoot中的dispatchKey()函数

  1. private final InputHandler mInputHandler = new InputHandler() {  
  2.         public void handleKey(KeyEvent event, InputQueue.FinishedCallback finishedCallback) {  
  3.             startInputEvent(finishedCallback);  
  4.             dispatchKey(event, true);  
  5.         }  
  6.   
  7.         public void handleMotion(MotionEvent event, InputQueue.FinishedCallback finishedCallback) {  
  8.             startInputEvent(finishedCallback);  
  9.             dispatchMotion(event, true);  
  10.         }  
  11.     };  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 下一页

相关内容