AndroidAndroid面试二

Android Input事件获取与分发简单总结

2019-02-09  本文已影响49人  Stan_Z
一、整体流程

系统Input事件传递主要经过如下几个部分:

1.1输入系统部分

输入子系统

手机的输入设备(包括屏幕、键盘、鼠标等),当前可用,会在文件系统/dev/input中创建对应的设备节点,用户操作输入设备会产生输入事件(按键事件、触摸事件、鼠标事件)等。

/dev/input/event0
/dev/input/event1
/dev/input/event2
...

InputManagerService
IMS初始化过程主要构造了如下结构:

从结构看,IMS核心功能实现在Native层:

1.2 WMS处理部分

WMS的职责之一就是输入系统的中转站,WMS作为Window的管理者,会配合IMS将输入事件交由合适的Window来处理。

1.3 View处理部分

app端的ViewRootImpl里面的InputEventReceiver会接到从Socket得到的InputEvent。最终走APP的事件传递,消费事件。

二、InputManagerService初始化过程

通过流程图可以看出,这部分主要是做了一系列的初始化工作:

三、InputReader处理InputEvent流程

简单总结:

InputReader从EventHub获取input event,将input event打包成Args放到InputDispacher的mInboundQueue,然后通过notifyKey唤醒InputDispacher。

四、InputDispatch分发流程

简单总结:

上节InputReader把input event放入了mInboundQueue(NotifyMotionArgs转换为MotionEntry,添加到队尾)。InputDispatcherThread被唤醒后,通过InputDispatcher主要任务是找到对应的window,并建立进程间通信,把input event 传递过去。

1)从mInboundQueue取出事件
2)通过EventEntry的类型,对不同事件进行不同处理,下面以TYPE_KEY为例
3)TYPE_KEY对应会执行dispatchKeyLocked,将事件分发出去

1)postCommandLocked 让policy处理Home、Menu等系统按键,policy对应的是NativeInputManager
2)findFocusedWindowTargetsLocked 判断发生按键事件的Window并得到对应的inputTargets
3)dispatchEventLocked 通过InputTarget获取对应的Connection,每个焦点窗口在InputDispacher里都有一个对应的Connection,通过这个Connection可以跟InputDispacher通信。然后发送事件EventEntry,先是将eventEntry放入Connection的outboundQueue,再通过InputPublisher将Entry发送给窗口,再将Entry从outboundQueue移到waitQueue里,最后由InputPublisher调用InputChanel的SendMessage(),SendMessage()再动用socket的send()函数,将打包好的Message发送给窗口。

应用在ViewRootImpl的setView(),最终会调用IWindowSession的addToDisplay()函数,该函数带上了mInputChannel参数,向WMS注册Channel。

五、App端处理流程

简单总结:

第一步是调用PhoneWindow.DecorView的dispatchKeyEvent函数,DecorView是View层次结构的根节点,按键从根节点开始按View的事件传递流程走。

第二步是判断按键是否是四向键,或者是TAB键,如果是则需要移动焦点。

本文只是参考了网上的文章,针对input系统总结了一个模糊的流程,input总体来看还是比较复杂的,想要深入学习还是需要针对源码进行详细分析。

参考
https://zhuanlan.zhihu.com/p/29152319
https://blog.csdn.net/urdfmqcul2/article/details/78146424
https://blog.csdn.net/xingchenxuanfeng/article/details/79208005
https://blog.csdn.net/chenweiaiyanyan/article/details/72884141

上一篇 下一篇

猜你喜欢

热点阅读