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端整体流程