博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android4.2 Input子系统
阅读量:4180 次
发布时间:2019-05-26

本文共 1024 字,大约阅读时间需要 3 分钟。

一、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层消息队列(见:)、经过消息循环和处理后分发给mView(PhoneWindow)、间接分发给App的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.详解事件分发

2.游戏手柄

3.驱动部分

4.项目问题

你可能感兴趣的文章
《tiny6410裸机程序》第九章:tiny6410按键控制蜂鸣器程序
查看>>
有关free()函数的一个问题
查看>>
《Android系统学习》之bug定位
查看>>
《Linux内核编程》第七章:USB CORE与USB键鼠驱动
查看>>
《Android系统学习》之JAVA与C混合编程——JNI
查看>>
《C预处理》之#ifndef
查看>>
《Linux内核编程》第十三章:Linux对进程内存的二级页式管理
查看>>
ARM协处理器
查看>>
《miniOS分析》前言
查看>>
《Linux内核编程》第十四章:Linux驱动基础
查看>>
Linux平台下ARM-Linux交叉编译工具链
查看>>
Window平台下ADS自带ARMCC编译工具链
查看>>
micro2440/tiny6410使用JLINK直接烧录nand flash
查看>>
C编译器、连接器与可执行机器码文件
查看>>
android linker 浅析
查看>>
802.11 traffic id
查看>>
Android系统wifi分析-手动连接过程
查看>>
设置IP别名Shell脚本
查看>>
Source Insight 宏-单行注释
查看>>
levelDB源码分析-Arena
查看>>