最近被問到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端整體流程