Android FrameWork Input触控事件处理流程 笔记

一 Input 事件概念

input 是最常见的事件之一,用户的点击、滑动、长按等操作,都属于 input 事件驱动。Android系统是基于事件驱动, input 属于其中的一种。input 的核心就是 InputReader 和 InputDispatcher。

二Input 事件 流程分析

从桌面点击应用图标启动应用来开始看整个 Input 事件流程。

  1. system_server的native线程InputReader首先负责从EventHub中利用linux的epolle机制监听并从屏幕驱动读取上报的触控事件,然后唤醒另外一条native线程InputDispatcher负责进行进一步事件分发(对事件进行包装后)。
  2. InputDispatcher中会先将事件放到InboundQueue也就是“iq”队列中,然后寻找具体处理input事件的目标应用窗口,并将事件放入对应的目标窗口OutboundQueue也就是“oq”队列中等待通过SocketPair双工信道发送到应用目标窗口中。(这里是通过socket通信 不是binder )
  3. 当事件发送给具体的应用目标窗口后,会将事件移动到WaitQueue也就是“wq”中等待目标应用处理事件完成,并开启倒计时,如果目标应用窗口在5S内没有处理完成此次触控事件,就会向system_server报应用ANR异常事件。
  4. 当input触控事件传递到桌面应用进程后(桌面应用也是个app 只不过是系统级别的),Input事件到来后先通过enqueueInputEvent函数放入“aq”本地待处理队列中,并唤醒应用的UI线程在deliverInputEvent的流程中进行input事件的具体分发与处理。
  5. 具体会先交给在应用界面Window创建时的ViewRootImpl#setView流程中创建的多个不同类型的InputStage中依次进行处理(比如对输入法处理逻辑的封装ImeInputStage),整个处理流程是按照责任链的设计模式进行(跟okHttp 一样 )。
  6. 最后会交给ViewPostImeInputStage中具体进行处理,这里面会从View布局树的根节点DecorView开始遍历整个View树上的每一个子View或ViewGroup界面进行事件的分发、拦截、处理的逻辑(这里客户端开发同学可以进行拦截处理le)。
  7. 最后触控事件处理完成后会调用finishInputEvent结束应用对触控事件处理逻辑,这里面会通过JNI调用到native层InputConsumer的sendFinishedSignal函数通知InputDispatcher事件处理完成,从触发从"wq"队列中及时移除待处理事件以免报ANR异常。

重要类解释
InputReader负责从EventHub里面把Input事件读取出来,然后交给 InputDispatcher 进行事件分发

InputDispatcher在拿到 InputReader获取的事件之后,对事件进行包装后,寻找并分发到目标窗口

InboundQueue队列(“iq”)中放着InputDispatcher从InputReader中拿到的input事件

OutboundQueue(“oq”)队列里面放的是即将要被派发给各个目标窗口App的事件

WaitQueue队列里面记录的是已经派发给 App(“wq”),但是 App还在处理没有返回处理成功的事件

PendingInputEventQueue队列(“aq”)中记录的是应用需要处理的Input事件,这里可以看到input事件已经传递到了应用进程

deliverInputEvent 标识 App UI Thread 被 Input 事件唤醒

InputResponse 标识 Input 事件区域,这里可以看到一个 Input_Down 事件 + 若干个 Input_Move 事件 + 一个 Input_Up 事件的处理阶段都被算到了这里

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android Framework核心知识笔记是一本介绍Android Framework核心知识的pdf文档。Android FrameworkAndroid系统的基础,它包含了一系列的类库和API,为开发Android应用程序提供了基本的功能和特性。 这本笔记首先介绍了Android Framework的概述,包括其组成部分和架构。然后详细讲解了Android四大组件(Activity、Service、Broadcast Receiver和Content Provider)的实现原理和使用方法。这些组件是Android应用程序的基本构建模块,理解它们的工作原理对于开发高质量的Android应用程序至关重要。 接着,笔记Android Framework中的UI设计进行了深入讲解。它介绍了View和ViewGroup的层次结构以及布局管理器的使用方法,帮助开发者实现灵活且具有吸引力的用户界面。此外,它还讨论了Android的绘图机制和动画效果,使开发者能够创建更加生动和吸引人的界面。 另外,笔记还包含了关于Android Framework中的数据存储和访问的内容。它介绍了SharedPreferences、SQLite数据库以及Content Provider等数据持久化的方法,帮助开发者存储和管理应用程序的数据。 此外,笔记还涵盖了与Android Framework相关的其他主题,如网络通信、多媒体处理、传感器和位置服务等。它们帮助开发者实现更多样化和功能强大的应用程序。 总结来说,Android Framework核心知识笔记是一本全面介绍Android Framework的教程,帮助开发者掌握Android应用程序开发的基本技能。对于想要成为Android开发专家的人来说,这是一本不可或缺的参考资料。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值