Android Input事件处理

  • Input UML 图表

Input UML 图表

系统启动SystemServer时创建其他服务,初始话Input管理服务,创建InputManager、InputReader对象
对于InputReader在初始化成功之后,start启动时,创建InputTread loop工作线程
framework/native/services/inputflinger/reader/InputReader.cpp

InputReader.h
private:std::unique_ptr<InputThread> mThread;InputReader.cpp
status_t InputReader::start() {if (mThread) {return ALREADY_EXISTS;}mThread = std::make_unique<InputThread>("InputReader", [this]() { loopOnce(); }, [this]() { mEventHub->wake(); });return OK;
}

如下图是系统启动input服务时序图:

#mermaid-svg-PuI6hnC6mfdIVqtR {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-PuI6hnC6mfdIVqtR .error-icon{fill:#552222;}#mermaid-svg-PuI6hnC6mfdIVqtR .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-PuI6hnC6mfdIVqtR .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-PuI6hnC6mfdIVqtR .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-PuI6hnC6mfdIVqtR .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-PuI6hnC6mfdIVqtR .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-PuI6hnC6mfdIVqtR .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-PuI6hnC6mfdIVqtR .marker{fill:#333333;stroke:#333333;}#mermaid-svg-PuI6hnC6mfdIVqtR .marker.cross{stroke:#333333;}#mermaid-svg-PuI6hnC6mfdIVqtR svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-PuI6hnC6mfdIVqtR .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-PuI6hnC6mfdIVqtR text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-PuI6hnC6mfdIVqtR .actor-line{stroke:grey;}#mermaid-svg-PuI6hnC6mfdIVqtR .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-PuI6hnC6mfdIVqtR .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-PuI6hnC6mfdIVqtR #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-PuI6hnC6mfdIVqtR .sequenceNumber{fill:white;}#mermaid-svg-PuI6hnC6mfdIVqtR #sequencenumber{fill:#333;}#mermaid-svg-PuI6hnC6mfdIVqtR #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-PuI6hnC6mfdIVqtR .messageText{fill:#333;stroke:#333;}#mermaid-svg-PuI6hnC6mfdIVqtR .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-PuI6hnC6mfdIVqtR .labelText,#mermaid-svg-PuI6hnC6mfdIVqtR .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-PuI6hnC6mfdIVqtR .loopText,#mermaid-svg-PuI6hnC6mfdIVqtR .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-PuI6hnC6mfdIVqtR .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-PuI6hnC6mfdIVqtR .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-PuI6hnC6mfdIVqtR .noteText,#mermaid-svg-PuI6hnC6mfdIVqtR .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-PuI6hnC6mfdIVqtR .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-PuI6hnC6mfdIVqtR .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-PuI6hnC6mfdIVqtR .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-PuI6hnC6mfdIVqtR .actorPopupMenu{position:absolute;}#mermaid-svg-PuI6hnC6mfdIVqtR .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-PuI6hnC6mfdIVqtR .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-PuI6hnC6mfdIVqtR .actor-man circle,#mermaid-svg-PuI6hnC6mfdIVqtR line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-PuI6hnC6mfdIVqtR :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} SystemServer InputManagerService com_android_server_input_InputManagerService NativeInputManager InputManager InputReader InputThread EventBug run startOtherServices new InputManagerService nativeInit(JNI) new NativeInutManager new InputManager createInputReader start nativeStart start start new InputThread() loop线程会 循环不断的 从EventBug中 读取Input事件 threadloop loopOnce getEvents 返回Input事件 SystemServer InputManagerService com_android_server_input_InputManagerService NativeInputManager InputManager InputReader InputThread EventBug

如图可知,inputThread这个线程的工作就是通过EventHub的getEvents监听读取Input事件。
获取到事件Input事件之后,通知InputDispatcher派发InputEvent事件
在InputReader中loopOnce方法最后一句是flush

    // Flush queued events out to the listener.// This must happen outside of the lock because the listener could potentially call// back into the InputReader's methods, such as getScanCodeState, or become blocked// on another thread similarly waiting to acquire the InputReader lock thereby// resulting in a deadlock.  This situation is actually quite plausible because the// listener is actually the input dispatcher, which calls into the window manager,// which occasionally calls into the input reader.mQueuedListener->flush();

如下图是flush动作的时序图

#mermaid-svg-6ZVvbbEULGZvvMpj {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-6ZVvbbEULGZvvMpj .error-icon{fill:#552222;}#mermaid-svg-6ZVvbbEULGZvvMpj .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-6ZVvbbEULGZvvMpj .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-6ZVvbbEULGZvvMpj .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-6ZVvbbEULGZvvMpj .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-6ZVvbbEULGZvvMpj .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-6ZVvbbEULGZvvMpj .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-6ZVvbbEULGZvvMpj .marker{fill:#333333;stroke:#333333;}#mermaid-svg-6ZVvbbEULGZvvMpj .marker.cross{stroke:#333333;}#mermaid-svg-6ZVvbbEULGZvvMpj svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-6ZVvbbEULGZvvMpj .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-6ZVvbbEULGZvvMpj text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-6ZVvbbEULGZvvMpj .actor-line{stroke:grey;}#mermaid-svg-6ZVvbbEULGZvvMpj .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-6ZVvbbEULGZvvMpj .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-6ZVvbbEULGZvvMpj #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-6ZVvbbEULGZvvMpj .sequenceNumber{fill:white;}#mermaid-svg-6ZVvbbEULGZvvMpj #sequencenumber{fill:#333;}#mermaid-svg-6ZVvbbEULGZvvMpj #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-6ZVvbbEULGZvvMpj .messageText{fill:#333;stroke:#333;}#mermaid-svg-6ZVvbbEULGZvvMpj .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-6ZVvbbEULGZvvMpj .labelText,#mermaid-svg-6ZVvbbEULGZvvMpj .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-6ZVvbbEULGZvvMpj .loopText,#mermaid-svg-6ZVvbbEULGZvvMpj .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-6ZVvbbEULGZvvMpj .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-6ZVvbbEULGZvvMpj .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-6ZVvbbEULGZvvMpj .noteText,#mermaid-svg-6ZVvbbEULGZvvMpj .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-6ZVvbbEULGZvvMpj .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-6ZVvbbEULGZvvMpj .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-6ZVvbbEULGZvvMpj .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-6ZVvbbEULGZvvMpj .actorPopupMenu{position:absolute;}#mermaid-svg-6ZVvbbEULGZvvMpj .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-6ZVvbbEULGZvvMpj .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-6ZVvbbEULGZvvMpj .actor-man circle,#mermaid-svg-6ZVvbbEULGZvvMpj line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-6ZVvbbEULGZvvMpj :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} InputReader InputListener InputDispather loopOnce mQueuedListener->>flush() notify notifyMotion interceptMotionBeforeQueueing filterInputEvent queueInboundEventLocked wake ->>dispatchOnce dispatchMotionLocked findTouchedWindowTargetsLocked dispatchEventLocked InputReader InputListener InputDispather

Android Input事件处理相关推荐

  1. Android Input 子系统初探

    Android系统基于Linux内核实现,内核作为整个操作系统的核心,对下,它负责整个硬件的驱动.实现对硬件器件的控制管理:对上,它提供各种系统所需的核心功能.Android系统支持的输入设备较多,如 ...

  2. AOSP源码分析:Android Input事件的产生、读取和分发

    大家好,今天为大家推荐来自MIUI的Cheeeelok同学的AOSP源码分析系列文章,本文依然从源码的角度带大家理解Android Input事件的产生.读取和分发.还没有看过作者上一篇文章 Andr ...

  3. android input(二) InputDispatcher

    android input(一) 初始化及InputReader流程 唤醒InputDispatcher 以Motion事件的分发过程来进行举例 void InputDispatcher::notif ...

  4. Android Input子系统-含实例源码

    Android Input子系统-含实例源码 1 Input子系统作用 Android很多外设都是用到输入输出设备,比如touchscreen,键盘,音量键等,输入 设备对应Android 框架是An ...

  5. android 按键用户点击事件,Android按键事件处理过程详解

    Android按键事件处理过程详解 (2013-09-26 14:05:19) 标签: it 在Android系统中,存在多种界面事件,如点击事件.触摸事件.焦点事件和菜单事件等,在这些界面事件发生时 ...

  6. Android input 系统InputReader,InputDispatcher线程实例--UI死掉

    Android input 系统InputReader,InputDispatcher线程实例–UI死掉但touch 正常报点 依据 Android input 系统初始化和启动流程中的背景: 做An ...

  7. Android中事件处理机制一分钟理清思路

    刚开始对我事件处理机制的概念还挺模糊的,而网上的讲解又很杂很乱.那么现在在这里你可以快速理清事件处理机制了. 首先用处肯定得知道: 事件处理机制就是为了应对嵌套式的布局中强焦点和弱焦点的点击事件进行自 ...

  8. Linux/Android——Input系统之frameworks层InputManagerService (六)【转】

    本文转载自:http://blog.csdn.net/u013491946/article/details/72638954 版权声明:免责声明: 本人在此发文(包括但不限于汉字.拼音.拉丁字母)均为 ...

  9. Android Input系统之触摸屏

    2019独角兽企业重金招聘Python工程师标准>>> 最近开始在TI平台调试触摸屏,之前研究过Android的Event输入设备驱动,对键盘比较了解.Input驱动程序包含游戏杆. ...

最新文章

  1. 云计算 - OpenStack
  2. Linux 内核中的 Device Mapper 机制
  3. Logback 配置文件这么写,TPS 提高 10 倍!
  4. 40款用于简洁网页设计的光滑英文字体【下】
  5. aws cognito_使用AWS Cognito的用户管理—(1/3)初始设置
  6. html中如何让三个方块并排,html – 并排设置两个div,然后设置第三个div
  7. 如何在labview中用c语言编程,编程语言之争:LabVIEW还是C语言?-测试测量-与非网...
  8. OpenCV4每日一练day13:双目相机校正
  9. URLRewiter使用
  10. WebTest of VSTS note 1
  11. 没有Angular 3,下一个Angular主版本将是Angular 4
  12. 八大排序算法(C语言实现)
  13. astah新建一个项目_Astah SysML
  14. 占内存最小的浏览器:360安全浏览器超速版推荐
  15. 初始化audio失败是什么意思_DirectXAudio初始化失败,高手看 – 手机爱问
  16. 他们的爱情 王小波和李银河
  17. 干货!怎么写满意度调查报告?
  18. 【7gyy】密码丢了?揭秘你的密码是如何被偷走的
  19. 【Web】Excle题库抽题组卷在jsp显示
  20. 软件测试度量分析,软件测试缺陷度量分析

热门文章

  1. Outlook里怎么设置网易企业邮箱【163企业邮箱注册】
  2. java实现分页功能(一)
  3. 新版本jdk(9、11、12、13、14)特性
  4. HDU 4602 Partition 规律题
  5. 【转】小船过河问题(贪心)
  6. Mysql优化算法-MRR(Multi-Range Read Optimization)
  7. 【语音唤醒】MDTC:Multi-scale dilated temporal convolutional network
  8. 8.0.高等数学3-向量的乘法运算(数量积、向量积与混合积)
  9. 使用ASP.NET Core和Hangfire实现HTTP异步化方案
  10. java通过jstack命令查询日志深入理解