Android中消息的整體派發過程:接收消息——消息處理前端——窗口管理系統派發消息——窗口進行消息處理
以上過程中前三步都在WmS中完成,按鍵消息直接發送給當前窗口,而觸摸消息則根據觸摸坐標位置來匹配所有窗口,並判斷坐標落到哪個窗口區域中,然後把消息發送給相應的窗口。對於按鍵消息還會涉及到“生理長按”的檢測,比如一直按住某個鍵,那麼會產生一些列的按鍵消息,然而第1個和第2個消息之間往往會間隔較長的時間,這種設計是人類本身的生理特點決定的,因為從按下到彈起的過程中,如果CPU處理太快,會導致產生多次該消息,這往往不是用戶所期望的,因此Android把這種消息處理延遲加入到了消息處理前端中,應用程序不需要關心第一次的延遲,只需按普通的DOWN消息處理。
下面具體分析Android中按鍵消息的派發流程:
每個窗口定義了一個ViewRoot(4.0中是ViewRootImpl)對象,而ViewRoot對象中定義了一個inputHandler,窗口管理系統(WmS)派發消息的過程中會調用inputHandler的handlekey(),該函數再調用ViewRoot中的dispatchKey()函數