android Input系統事件分發流程

 最近被問到android Input系統事件分發流程,雖然有看過相關源碼,但是隻是匆匆一瞥,沒什麼印象,解釋了半天自己都暈了,甚是尷尬。特地重新看了一遍,整理在博客上,加深一下印象。

 網上對android的事件分發流程的講解很多,我就不具體鋪代碼了,找了幾張程序流程圖,幫助理解。


估計大家沒耐心看這麼多流程圖,把總結放在前面:

1 Kenel收到InputEvent放到EventHub裏

2 InputReader從EventHub讀InputEvent並且傳給InputDispatcher來分發

3 WindowManagerService在app端setView的時候就創建了一對Socket連接,InputDispatcher利用這個Socket連接和app端通信。這裏實在是有些奇怪,在android系統裏,幾乎所有的跨進程通信都是binder,唯獨這裏用了Socket,不能理解。

4 app端的ViewRootImpl裏面的InputEventReceiver會接到從Socket得到的InputEvent。

5 然後給第一個InputStage處理這個InputEvent,如果第一個InputStage不消費該InputEvent,就給第二個InputStage,還不消費就給第三個,直到給了ViewPostImeInputStage後,如果它可以消費的話,執行它的onProcess方法,該方法裏面再經過幾次調用就到了大家熟悉的dispatchTouchEvent方法。至此,app就可以處理input事件了。


一 整體流程

二 android系統input manager初始化的過程

三 InputReader 處理inputEvent流程

四 InputDispatcher 處理流程

五 SystemServer部分整體流程

六 InputEventReceiver 處理流程

七 app端整體流程