androd输入管理系统机制解析


    android的输入管理系统主要完成按键、触摸板、鼠标等输入设备的事件输入,功能包括,输入设备的事件输入及向焦点窗口和焦点视图的事件派发,事件的插入,事件的过滤,事件的拦截等功能。

整个输入系统包括服务端和客户端两部分,服务端部分主要完成输入设备事件的读取、事件的映射、事件的插入、事件的过滤、事件的拦截等功能;客户端部分主要完成事件向焦点窗口和焦点视图的派发。

输入系统的整个架构采用的是管道过滤器模式(Pipe and Filter)架构模式。服务端的InputReader和InputDispatcher对象及客户端的InputEventReceiver对象及InputConsumer对象对应着过滤器构件,具有各自的输入、处理、输出单元,两者通过管道连接到一起。

下图是ANDROD4.4 版本的服务端的系统类图,4.4  版本的输入系统相对于4.0版本作了如下较大改动:输入管理服务从窗口管理服务中独立了出来, C++ 实现部分结构也作了优化,其各个模块部分之间采用了接口进行交互,包括输入事件读取接口InputReaderInterface、事件监听和提交接口InputListenerInterface和InputDispatcherInterface,以及原始事件接收接口EventHubInterface。

 

图中上面部分为JAVA部分对应的类,主要是一个输入管理服务InputManagerService和客户端的事件接收和事件派发类,下面部分为C++本地实现的部分,C++部分主要由InputReader、InputDispatcher两个过滤器构件和线程及辅助对象构成,两个过滤器构件的任务在对应的两个线程InputReaderThread和InputDispatcherThread内运行。   

InputReader类是InputReaderInterface接口的实现,用来实现事件的读取功能。 InputDispatcher类是InputDispatcherInterface接口的实现类, 而InputDispatcherInterface 接口又是InputListenerInterface接口的派生接口,用来实现输入事件的监听和提交。

整个流程包括事件读取流程和事件提交两个流程,分别运行在InputReaderThread和InputDispatcherThread两个线程内。在输入读取线程内,InputReaderInterface接口对象通过EventHubInterface接口从驱动读取原始输入事件,经过事件映射后通过InputListenerInterface接口提交给InputDispatcher对象,在InputDispatcherThread线程内由对象InputDispatcher对象、InputPublisher 对象共同负责事件的提交,最后通过InputChannel对象发送输入事件到服务端的管道内,由客户端通过InputConsumer从管道的另一端读取事件。

InputReader、InputDispatcher对象以及InputReaderThread和InputDispatcherThread两个线程对象都由本地InputManager类创建和启动,而本地InputManager类则有上面框架中的InputManagerService通过JNI进行实例化,在其nativeInit JNI接口中创建一个NativeInputManager对象作为JAVA层与本地层的交互对象,NativeInputManager对象实例化时创建本地InputManager对象和EventHub对象。     

输入系统管道的打开及服务端事件提交管道的注册则在WindowManagerService调用addWindow函数新建窗口时创建和注册;而客户端事件输入管道的注册由客户端ViewRootImpl对象调用SetView时注册。因此输入系统服务端运行在输入管理服务进程内,客户端运行在应用程序所在进程内。   

一、 输入系统服务端事件读取和派发流程(正常情况)

 

             整个流程由InputReaderThread线程触发,在线程中调用InputReader对象的loopOnce函数,在loopOnce函数中首先通过EventHubInterface接口的getEvents函数读取输入设备事件,经过处理后从事件中获得对应的deviceId,根据deviceId在mDevices数组中找到对应的输入设备对象或者构造新的InputDevice对象,然后调用InputDevice的process函数。

              在InputDevice的process函数中对每个事件由InputDevice对象的mMappers数组中登记的每个InputMappe

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值