歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Android中按鍵消息的派發過程及源碼分析

Android中按鍵消息的派發過程及源碼分析

日期:2017/3/1 10:18:13   编辑:Linux編程

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. public void handleMotion(MotionEvent event, InputQueue.FinishedCallback finishedCallback) {
  7. startInputEvent(finishedCallback);
  8. dispatchMotion(event, true);
  9. }
  10. };
Copyright © Linux教程網 All Rights Reserved