Android4.2 Input子系统

来源:互联网 发布:数据采集器原理 编辑:程序博客网 时间:2024/05/01 18:37

一、Android的Input子系统启动过程

1.init进程通过Zygote启动SystemServer


2.SystemServer通过WM启动InputManager的两个线程


二、事件分发整体说明

1.InputReaderThread线程调用InputDispatcher分发给InputDispatcherThread线程消息队列mInboundQueue。

2.InputDispatcherThread线程从消息队列mInboundQueue中取出事件分发给当前激活窗口对应C++层消息队列outboundQueue,InputDispatcherThread从当前激活窗口对应C++层的消息队列outboundQueue中取出事件并拷贝至共享内存mSharedMessage。

3.ViewRoot注册进NativeInputQueue的回调函数handleReceiveCallback从共享内存mSharedMessage中取出事件并调用ViewRoot的handleKey/Motion()函数分发进ViewRoot的JAVA层消息队列(见:《Android系统学习》第十章:Android消息处理、消息循环和消息队列)、经过消息循环和处理后分发给mView(PhoneWindow)、间接分发给App的Activity(见《Android系统学习》第十一章:Android应用程序Activity组件分析)。

注意:App中有类继承了Activity类并重新实现了响应函数。

以上1、2中,由于C++层Looper本身就有睡眠/唤醒管道机制、所以是异步处理机制!

以上3中、由于使用了JAVA层looper、handle和messagequeue,所以、也都是异步处理机制!

4.补充

对于上述步骤2和3的说明:Android4.1之后已经不用共享内存了,换之是socket传输:

2中:InputDispatcherThread从当前激活窗口的消息队列outboundQueue中取出事件通过C++层InputChannel的socket发送;

3中:ViewRoot注册进NativeInputEventReceiver的回调函数handleEvent通过C++层InputChannel的socket接收,并分发给ViewRoot的JAVA层消息队列。

并且Android4.1不像之前Android版本会去创建睡眠/唤醒管道和共享内存,换之只是一对socket描述符、完成唤醒/睡眠和数据传输任务。

三、相关链接

1.详解事件分发

Android之Input子系统事件分发流程

Android之Input子系统与输入法

2.游戏手柄

Linux JoyStick设备驱动

Android Input之JoyStick

3.驱动部分

《Android系统学习》第一章:Input子系统驱动部分

Linux内核学习实践之红外驱动分析

Linux IR遥控器不灵敏调试

Linux内核学习实践之GPIO面板按键

《Linux总线、设备与驱动》USBHID设备驱动

《Linux内核编程》第七章:USB CORE与USB键鼠驱动

4.项目问题

Android之Input子系统配置更新导致的Activity重启

Android之Input子系统按键repeat

获取输入设备的vid和pid

Android系统对于Touch设备配置

Android的dialog控制焦点导致其后Activity不响应



原创粉丝点击