歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

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.     };  
Copyright © Linux教程網 All Rights Reserved