android事件传递——2.传递流程详解

Android 耳机事件传递流程 在项目中,遇到问题:插入不带麦耳机,状态栏显示仍然是带麦图标。 解决此问题涉及到耳机的拔插事件传递流程,在此分析一下Android系统,耳机拔插流程源码分析。Android系统的耳机目前可以实现拍照、暂停/播放、打电话等功能,这一切的基础是耳机拔插成功,结合InputManagerService的相关知识,主要从framework层面分析耳机插拔事件的传递。一、驱动层的事件上传使用adb 命令可以 阅读详情

1 完整的事件传递流程

下沉

事件从上到下(即从父级到子级),依次通过各个控件的dispatchTouchEvent方法:

  • 在dispatchTouchEvent方法中会调用onInterceptTouchEvent方法判断是否要拦截,如果拦截(onInterceptTouchEvent返回true),则将事件交给同一控件的onTouchEvent方法,如果不拦截,则将事件继续传递给子控件的dispatchTouchEvent。

  • 如果所有的父控件都没有拦截,则事件会一路往下传递直到最底层控件的dispatchTouchEvent,此dispatchTouchEvent也会先将事件传递给onInterceptTouchEvent(假设最底层控件是一个ViewGroup),但不管onInterceptTouchEvent是否拦截,事件都会被传递给同一控件的onTouchEvent,因为此控件是最底层的控件,往下已没有子控件了。(如果最底层控件是一个View,因为View没有onInterceptTouchEvent方法,事件会被直接传递给onTouchEvent)。

  • 这一过程可以形象地称之为“下沉”。

上浮

一旦某一控件的onTouchEvent获取到事件(不管是因为此控件是最底层的控件而获取到,还是因为事件被同一控件的onInterceptTouchEvent拦截而获取到),那么事件从上到下传递的流程就结束了,接下来,事件会从此onTouchEvent方法开始,从下往上依次传递给每个父控件的onTouchEvent方法————除非事件在某个onTouchEvent中被消耗掉了(onTouchEvent返回true)。这一过程可以形象地称之为“上浮”。

由前面的知识我们知道,dispatchTouchEvent是负责事件分发的方法,事件的下沉就是通过调用dispatchTouchEvent方法来实现的,因此,事件的下沉过程中所经历的每一个控件,其dispatchTouchEvent方法都会被调用;而在事件上浮的过程中,任何控件的dispatchTouchEvent都不会被调用。在下面的论述中,为了简便,我们会省略对dispatchTouchEvent调用的描述。

2 简化的事件传递流程

将事件分为两种:down事件和后续事件(主要指move、up)。只有down事件会走上述的完整事件传递流程,后续事件走的都是简化的事件传递流程。

我们将“事件只向下传递到控件M为止,而不会继续往下传递”的现象称为“事件在M处被截断”。

假设有几个控件从上到下依次为(这里及以后的“上下”都是指的“父子”关系,而并非位置的上下关系):

...
A
B
C
...

结论1

对于某控件B,onTouchEvent获取到down事件后(不管此down事件是B的onInterceptTouchEvent拦截到的,还是因其子控件未消耗而上浮上来的,或是因为B是最底层的控件),只要B消耗了down事件(onTouchEvent返回true),那么同一事件序列的后续事件(move和up)都将在B处被截断(即事件下沉过程截止到B,不会再继续往下传递),此外,后续事件也不再经过B的onInterceptTouchEvent。后续事件的下沉流程变为:从上到下依次经过B的各层父控件的onInterceptTouchEvent方法,如果父控件均不拦截,则将事件交给B的onTouchEvent。(但如果在B的dispatchTouchEvent中调用了requestDisallowInterceptTouchEvent(true),则后续事件的下沉流程将跳过所有父控件的onInterceptTouchEvent,直接传递给B的onTouchEvent。另外需要注意:requestDisallowInterceptTouchEvent(true)不影响down事件下沉,只影响后续事件下沉。)


对于传递给B的onTouchEvent方法的后续事件,无论B是否消耗后续事件,后续事件的下沉流程都是不变的,而对于后续事件的上浮:

1.如果B消耗了某个后续事件,那么此后续事件就没有了,自然也就不会传递给其他任何控件。
2.如果某个后续事件没有被B消耗掉,那么此后续事件经过B的onTouchEvent后,会直接传递给Activity的onTouchEvent,而不会再经过B的任何父控件的onTouchEvent。


在如上所述的后续事件下沉流程中,如果B的父控件A突然拦截了某个后续事件,则无论A的onTouchEvent是否消耗后续事件,后续事件都将在A处被截断,并且后续事件也不会再经过A的onInterceptTouchEvent。后续事件的下沉流程变成:从上到下依次判断A的各层父控件是否拦截事件,如果父控件均不拦截,则直接将事件交给A的onTouchEvent。

结论2

如果在down事件的下沉和上浮过程中,任何控件都没有消耗down事件,那么down事件最终会上浮到Activity的onTouchEvent中。无论Activity的onTouchEvent是否消耗了down事件,此事件序列的后续事件都会直接传递给Activity的onTouchEvent,即事件在Activity处被截断了。

推论1

**由结论1、2很容易知道,影响后续事件下沉流程(或者说,后续事件在何处被截断)的因素只有两个:1.down事件在哪里被消耗;2.后续事件在哪里被拦截。而后续事件是否被消耗,在哪里被消耗,都不会影响后续事件的下沉流程。**具体来说:

  1. down事件:某个控件消耗了down事件(onTouchEvent返回true),则后续事件在此控件处被截断,并且此控件的onInterceptTouchEvent也不会再被调用。如果没有任何控件消耗down事件(其实最底层的控件通常默认都会消耗down),则后续事件将在Activity处被截断。

  2. 后续事件:如果某个控件拦截了后续事件(onInterceptTouchEvent返回true),则后续事件将在此控件处被截断(与此控件onTouchEvent的返回值无关),并且此控件的onInterceptTouchEvent也不会再被调用。

推论2(了解)

**由结论1、2很容易知道:如果B的onTouchEvent接收到down事件却没有消耗它,那么同一事件序列中的后续事件都不会再传递给B及B的子控件了。**因为,down事件必然:1.被B的某一级父控件给消耗掉了 或 2.被传递给了Activity,这必然导致后续事件在B的上方被截断。

推论3(了解)

无论B拦截了down事件还是后续事件(onInterceptTouchEvent返回true),则B的onInterceptTouchEvent都将无法再接收到此事件序列的后续事件:

B拦截了down事件:

  1. 若B的onTouchEvent消耗了down,则后续事件将只经过B的父控件的onInterceptTouchEvent和B的onTouchEvent。
  2. 若B的onTouchEvent没有消耗down,那么后续事件必然在B上方的某处被截断。

B拦截了后续事件:由结论1可知,后续事件将在B处被截断,并且B的onInterceptTouchEvent不会再被调用。

用python自动复制粘贴excel表里某一列的数据到另一个表中 昨天接到人事小姐姐求助减轻复制粘贴的重复工作量,分享一下代码 半路新手上路 耶 把 2.xlsx 表里的第二列 的数据复制粘贴到 test.xlsx的第一列 python3.6.2 from openpyxl import Workbook from openpyxl import load_workbook from openpyxl.writer.excel import Exc... 阅读详情

相关推荐

3D slicer查看形变场

3Dslice显示数据和形变场 将需要可视化的数据也导入3Dslice,注意描述为volume(图1a),如果没有显示是因为路径中不能有中文,也就是moving图像。 (b) 图1、数据导入形变场和 将相应的形变场数据直接拖入3Dslice,并修改描述为形变场(图1b)。 点击transform菜单图2(a),然后勾选形变场可视化图2(b)。 (b) 图2...

fanre的专栏 1947

Android Touch事件传递

android系统中每个ViewGroup的子类都具有下面3个和TouchEvent处理相关的方法: 1. dispatchTouchEvent(MotionEvent ev) 在Activity中可以看到 public boolean dispatchTouchEvent(MotionEvent ev) { if (ev.getAction() == Mo

kissfan_7的博客 432

彻底清理Easy Connect残留:从服务到驱动的完整卸载指南

在企业网络接入场景中,远程客户端常因内核驱动、系统服务和网络过滤组件导致卸载残留,进程无法结束、文件被锁定、注册表项顽固存在。其原理在于驱动挂载网络协议栈,服务守护进程,卸载时资源占用导致清理不彻底。彻底清理的技术价值在于恢复系统纯净、避免网络异常和软件冲突。典型应用场景包括企业办公机、个人笔记本更换或重装客户端。本文针对深信服Easy Connect,提供从停止服务、删除驱动到清理注册表和虚拟网卡的分步操作链路,并给出验证方法和避坑经验。

weixin_31292729的博客 239

Android面试——事件的传递机制

Android事件的传递机制前言 最近面试了很多公司,大多数公司都问到了这么一个问题,就是Android事件的传递机制,那Android事件的传递机制到底是怎么一回事?今天我们来探讨探讨! 正文 Android中三个方法是关于事件传递的,分别是dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent,那这三个方法分别有什么用呢?其实我们可以从

Le_leezp的博客 783

分布式推理服务(策略:数据并行、张量并行、流水线并行、专家并行)技术分析

摘要:分布式推理突破单GPU内存和算力限制,支持大模型部署。四种核心策略包括: 数据并行:复制模型拆分数据,提升吞吐但内存效率低; 流水线并行:模型分阶段执行,支持超大模型但存在计算气泡; 张量并行:拆分层内矩阵运算,延迟低但通信开销大; 专家并行:动态激活MoE模型专家,计算高效但路由复杂。实际应用中常组合策略(如3D并行),需权衡模型规模、硬件条件与性能目标。

技术引领业务创新 944

NXP MCU CAN波特率(位时间)配置详解

1. 概述 本文将会详细讲解如何设置NXP MCU的CAN波特率、位时间、采样点等属性。 波特率即CAN总线传输频率,位时间是波特率的倒数,例如波特率是500K,那么位时间 = 1 / 500000 = 0.000002s = 2000ns。 我们先来看一下S32K144单片机的EB中与CAN总线波特率相关的可配置参数有哪些: ...

weixin_42967006的博客 9691

AN子控件将点击事件给父控件

今天遇到一个小问题。 如图这个CheckBox控件外面包裹了一个Relativelayout。 想让用户点击Relativelayout就触发CheckBox的点击事件选中事件。把点击事件给了Relativelayout。 本来没有什么问题 。点击的时候发现是可以触发checkbox的点击事件。但是在点击checkbox本身的时候。 并没有触发到Relativelayout的点击事

huyawenz的博客 1608

基于Simulink的PID控制汽车巡航控制系统建模与仿真

汽车巡航控制系统(Cruise Control System)是一种通过自动调节发动机输出功率来维持车辆以恒定速度行驶的技术。这种系统能够减轻驾驶员在长途驾驶中的疲劳,同时提高燃油经济性和行车安全性。PID(比例-积分-微分)控制器因其结构简单、性能稳定且易于实现而被广泛应用于汽车巡航控制系统中。本项目旨在通过MATLAB/Simulink平台设计和验证一个基于PID控制的汽车巡航控制系统,重点研究PID参数调优方法、系统动态响应特性以及稳态误差消除能力。

MHD0815的博客 196

Android Touch事件传递详解

外链图片转存中…(img-hD43nej0-1711762147077)]

2401_84003809的博客 1514

Could not find a package configuration file provided by “boost_signals“

gmapping/slam_gmapping/gmapping/CMakeLists.txt:14 (find_package)问题在14行,注释该行。,该语句的用以为告诉项目Boost库文件所在。

weixin_72050316的博客 1027

【2026OD新机考】【哈希表】20260422-文章特征提取【Py/Java/C++/C/JS/Go六种语言OD真题】【欧弟算法】全网注释最详细分类最全的华子OD真题题解

90+天陪伴式学习,100+直播课时,300+动画图解视频,500+LeetCode经典题,500+华为OD真题/大厂真题,还有简历修改、模拟面试、陪伴小群、资深HR对接将为你解锁。这道题的本质是多集合交集问题的变形,属于非常典型的哈希表应用题。,储存全局的每个片段中,各个字符最少出现的次数。表示该字母并非所有片段的公共字母。,按照顺序构建答案即可。没有字母在所有三个字符串中都出现。每个字母在各字符串中都至少出现。次,所以结果中每个字母出现一次。这样,当上述循环结束后,最终。显然在上述代码中,如果字母。

weixin_48157259的博客 66

Android 事件传递相关流程图

之前从来没有总结过Android事件传递的流程图,此处,绘制一下简版Android事件传递流程图,方便理解事件传递的过程。

Ung8023 342

区块链技术概述:从比特币到Web3.0

区块链技术正重塑数字世界的信任机制。本文系统梳理了区块链的发展路径:从比特币的PoW共识和UTXO模型,到以太坊的智能合约和账户体系,直至Web3.0的去中心化互联网愿景。文章详细解析了区块链的核心特性(去中心化、不可篡改等)和数据结构,通过流程图展示了比特币交易生命周期和智能合约执行流程,并对比了Web2.0与Web3.0的关键差异。最后,用Python代码实现了包含区块类、交易处理和挖矿机制的简易区块链系统,为理解区块链底层原理提供了实践参考。

闲人编程的博客 456

Android 事件传递机制详解(事件的分发、拦截、处理)

1、事件在Android中的传递顺序 事件在Android的传递顺序: Activity--> Window-->DecorView --> 布局View 或者说以上顺序是事件在应用层的传递顺序。如果要说整个事件的传递机制,是Android底层收到触摸屏的事件后,使用socket跨进程通信,用InputDispatcher将事件发送给APP进程,由主线程的Looper去取出消...

追yi流年 2万+

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

android inputmanager中事件的传递流程

涉及文件路径: frameworks\base\services\core\java\com\android\server\input\InputManagerService.java frameworks\base\core\java\android\view\InputChannel.java frameworks\base\core\jni\android_view_InputChannel...

搬砖的老牛 2323

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Android事件的传递机制

Android事件传递机制 Android事件的构成: 在android中,事件主要包括点按,长按,拖拽,滑动等等,另外点按还包括点击和双击。所有这些都构成了android中的事件响应。总的来说所有的事件都由以下三个部分组成: 按下(ACTION_DOWM) 移动(ACTION_MOVE) 抬起(ACTION_UP)

老秦的专栏 1792

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

android点击事件在activity中的传递流程

概述 当手指点击屏幕时候,linux就会接收到对应的事件中断,然后将这些中断事件包装成输入事件写入到相应的设备节点中,android输入系统所进行的操作大致来说就是监控这些设备节点,当有数据可读时候就读取这些数据,将其翻译成点击事件,然后寻找到合适的窗口,将其派发下去。 一个点击事件的传递流程 当产生一个点击事件后,首先在ViewRootImpl的WindowInputEventReceiver中...

搬砖的老牛 2509

Android 事件传递机制总结

Android 事件传递机制总结 Android View虽然不是四大组件,但是其重要程度堪比四大组件。初级工程师到中高级工程师,这些都是很重要的,因为事件分发机制面试也会经常被提及,如果我们能get到要领,并跟面试官深入的交流一下,那么一定会让面试官对我们印象深刻,发放offer。 就为了这个我们刨根问底深入学习一下事件传递机制,也是很值得的。 下面我们就从以下几个部分分析一下事件传递机制:...

samuelnotes的专栏 7883

Android webkit 事件传递流程

前言:基于android webview 上定制自己使用的可移植浏览器apk,遇到好多按键处理的问题。所以索性研究了一下keyevent 事件的传递流程。 frameworks 层 keyevent 事件开始是从/frameworks/base/core/java/android/webkit目录下WebViewClassic.java 中的onKeyDown() 函数开始的

东辉在线的专栏 1165

《Android》事件传递过程

1、什么是事件传递? Android事件传递是指用户操作屏幕产生的一系列动作事件(按下、滑动、抬起)从外层传递到的内层的过程。 2、外层到内层如何理解? Activity —> Window ----> ViewGroup ---->View 3、必须了解的基础 3.1 首先要知道传递的对象是一个MotionEvent类的对象。这个类中定义了动作常量,比如“按下” public...

有错望纠 1967

Android鼠标移动事件在framework层的传递流程

Android鼠标移动事件在framework层的传递流程前言EventHub对事件的收集设备事件的读取方式收集事件与确定设备类型InputReader对事件的处理与存储事件的处理过程将处理后的事件存入队列通知InputDispatcher读取队列中事件InputDispatcher对事件的分发InputDispatcher分发事件的触发机制对事件的分发过程通知应用层接收事件总结参考文献 前言 上...

初夏夕空的博客 2351
上一篇: android事件传递——1.概述
下一篇: 子窗口(child window)应用实战
三杯两盏
博客等级 码龄10年 87粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值