android 事件传递机制

Android事件传递机制-View篇 Android事件传递机制绝对不是三言两语就能说得清的,在网上查了相关资料,觉得大部分都没有讲的很清楚透彻,写本文的目的就是让更多的开发者进从FrameWork层到Application层一步步深入Android事件传递机制的原理,今天先小小试牛刀,主要是讲View的事件传递机制原理,下一篇会将更复杂的控件ViewGroup事件的传递机制。 比如一个页面有一个Button 按钮,设置了onCli 阅读详情
在系统启动过程中,会加载驱动程序,初始化硬件设备,会进入bool EventHub::openPlatformInput(void)这个函数,该函数主要功能是扫描/dev/input该目录,获取输入设备。如何获取呢?通过linux API res = scan_dir(device_path); 该函数叫 while((de = readdir(dir))) { strcpy(filename, de->d_name); open_device(devname); } 不断读取目录文件,然后通过open_device()打开设备。具体打开设备函数是fd = open(deviceName, O_RDWR);以读写方式打开,该函数会调用驱动里file_operations里的实现函数。 此时所有输入设备已经打开。 在WindowManagerService服务类运行的时候,在构造函数中会创建内部类KeyQ对象. 该类继承之KeyInputQueue类。当然要进入该类的构造函数。在KeyInputQueue类的构造函数中会启动Thread mThread=new Thread("InputDeviceReader")这个匿名内部类线程,有该线程读驱动事件并把它放到消息队列中。具体实现是: Thread mThread = new Thread("InputDeviceReader") { public void run() { RawInputEvent ev = new RawInputEvent(); while (true) { InputDevice di; readEvent(ev); } } 该线程持续运行,循环通过readEvent(); 该函数是个native方法,具体实现为 static jboolean android_server_KeyInputQueue_readEvent(JNIEnv* env, jobject clazz, jobject event) { gLock.lock(); sp hub = gHub; if (hub == NULL) { hub = new EventHub; gHub = hub; } gLock.unlock(); int32_t deviceId; int32_t type; int32_t scancode, keycode; uint32_t flags; int32_t value; nsecs_t when; bool res = hub->getEvent(&deviceId, &type, &scancode, &keycode, &flags, &value, &when); } 以上步骤获得了事件QueuedEvent。 获得事件后通过 private void addLocked(InputDevice device, long when, int flags, int classType, Object event) { boolean poke = mFirst.next == mLast; QueuedEvent ev = obtainLocked(device, when, flags, classType, event); QueuedEvent p = mLast.prev; while (p != mFirst && ev.when < p.when) { p = p.prev; } ev.next = p.next; ev.prev = p; p.next = ev; ev.next.prev = ev; ev.inQueue = true; } 该函数加到消息队列中,该消息队列就是个双向连表,头和尾分别是 final QueuedEvent mFirst; final QueuedEvent mLast; 该函数就是把新消息插到尾的前面。 消息队列有了。还需要读队列。在WindowManagerService.java 类中同时又开了个内部线程 mInputThread = new InputDispatcherThread(); mInputThread.start(); 该线程和刚才的写队列线程是并行的。该线程起来后,通过 public void run() { while (true) { try { process(); } catch (Exception e) { Log.e(TAG, "Exception in input dispatcher", e); } } } 这个process()函数来读消息。具体实现是 private void process() { android.os.Process.setThreadPriority( android.os.Process.THREAD_PRIORITY_URGENT_DISPLAY); while (true) { QueuedEvent ev = mQueue.getEvent( (int)((!configChanged && curTime < nextKeyTime) ? (nextKeyTime-curTime) : 0)); } 该getEvent()函数的具体实现是 QueuedEvent getEvent(long timeoutMS) { long begin = SystemClock.uptimeMillis(); final long end = begin+timeoutMS; long now = begin; synchronized (mFirst) { while (mFirst.next == mLast && end > now) { QueuedEvent p = mFirst.next; mFirst.next = p.next; mFirst.next.prev = mFirst; p.inQueue = false; return p; } } 持续的读消息,如果没消息就阻塞,有消息,就读取消息,所谓读取消息就得到引用,然后把该消息从双向连表中删除。得到消息后根据消息输入设备类型把消息发送到具体AP 中。如 switch (ev.classType) { case RawInputEvent.CLASS_KEYBOARD: dispatchKey((KeyEvent)ev.event, 0, 0); mQueue.recycleEvent(ev); break; case RawInputEvent.CLASS_TOUCHSCREEN: dispatchPointer(ev, (MotionEvent)ev.event, 0, 0); break; case RawInputEvent.CLASS_TRACKBALL: dispatchTrackball(ev, (MotionEvent)ev.event, 0, 0); break; case RawInputEvent.CLASS_CONFIGURATION_CHANGED: configChanged = true; break; default: mQueue.recycleEvent(ev); break; } 当然这其中涉及很多细节,有兴趣可以看看。同时读写队列的互斥机制也值得学习。
Android Touch事件传递机制全面解析(从WMS到View树) 转眼间近一年没更新博客了,工作一忙起来,很难有时间来写博客了,由于现在也在从事Android开发相关的工作,因此以后的博文也会更多地专注于这一块。 这篇文章准备从源码层面为大家带来Touch事件的传递机制,我这里分析的源码时Android4.4的。说到分析源码,光看肯定是不行的,一定要亲自去跟,并且要边跟边思考,所以在下一篇中,会有一个Demo来为大家详细分析源码的走向。 阅读详情

相关推荐

银河飞腾FT6678实战指南:OpenMP多核并行编程优化技巧

本文详细介绍了在银河飞腾FT6678多核处理器上使用OpenMP进行并行编程的实战技巧与优化方法。从基础语法到环境配置,再到性能优化的五大核心技巧,包括循环并行化、并行粒度控制、reduction子句使用等,帮助开发者充分发挥FT6678的8核计算能力。通过实际案例展示如何将图像处理算法从200ms优化到28ms,并深入探讨了任务调度、内存访问优化等进阶主题。

weixin_29234423的博客 287

Android事件的传递机制

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

老秦的专栏 1792

VS2019集成AddressSanitizer:C++内存错误检测实战指南

在C++开发中,内存管理是核心挑战之一,涉及堆、栈和全局变量的分配与释放。其原理在于程序运行时对内存地址的访问必须严格遵循分配边界和生命周期规则,否则会导致缓冲区溢出、释放后使用等严重错误。这类问题的技术价值在于直接影响程序的稳定性、安全性和性能,是高质量软件必须攻克的基础难题。应用场景广泛,从嵌入式系统到大型服务器软件,都需要可靠的内存错误检测机制。AddressSanitizer(ASan)作为一种编译时插桩技术,通过影子内存和运行时检查,能精准定位堆缓冲区溢出、释放后使用等隐蔽错误。本文以Visual

weixin_34356310的博客 279

Android触摸事件传递机制—源码解读

在做需求开发中,我使用ViewPager嵌套Fragment,而Fragment又嵌套了Recyclerview组件。这样就导致RV滑动与Viewpager滑动事件产生手势冲突的问题。在深入理解Android触摸事件的传递机制后,我解决了这个问题。遂决定写下这篇博客,来深入分析相关源码。

m0_53269463的博客 958

从建模到调参:基于Simulink的两轮差速机器人轨迹跟踪PID控制全流程解析

本文详细解析了基于Simulink的两轮差速机器人轨迹跟踪PID控制全流程。从运动学建模入手,对比了基于距离与基于位置偏差的两种控制策略,并重点阐述了高精度轨迹跟踪的控制器设计、Simulink仿真搭建及PID参数整定方法,为移动机器人运动控制提供了完整的仿真实践指南。

weixin_29169505的博客 314

文本→图像→视频:AIGC跨模态转换全流程解析

本文旨在系统性地解析AIGC领域中跨模态内容生成的技术原理和实现方法,特别聚焦于从文本到图像再到视频的完整转换流程。跨模态表示学习的基本原理文本到图像生成的核心技术图像到视频转换的关键算法端到端跨模态生成系统的构建方法实际应用场景和性能优化策略背景介绍:建立基本概念和知识框架核心概念:解析跨模态转换的关键技术和原理算法细节:深入讲解文本到图像、图像到视频的核心算法数学模型:提供必要的数学基础和公式推导项目实战:通过完整案例展示实现过程应用场景:探讨技术的实际应用可能性。

AI天才研究院 1353

Android 事件传递机制总结

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

samuelnotes的专栏 7883

[系统安全] 一.什么是逆向分析、逆向分析基础及经典扫雷游戏逆向

娜璋AI安全之家于2020年8月18日开通,将专注于Python和安全技术,主要分享Web渗透、系统安全、CVE复现、威胁情报分析、人工智能、大数据分析、恶意代码检测等文章。真心想把自己近十年的所学所做所感分享出来,与大家一起进步。 系统安全系列作者将深入研究恶意样本分析、逆向分析、攻防实战等,通过在线笔记和实践操作的形式分享与博友们学习,希望能与您一起进步。第一篇文章先带领大家学习什么是逆向分析,然后详细讲解逆向分析的典型应用,接着通过OllyDbg工具逆向分析经典的游戏扫雷,再通过Cheat Engin

杨秀璋的专栏 2万+

结合源码理解Android中的事件传递机制

结合源码和具体示例,分析Android中的事件传递机制

weixin_50995731的博客 1167

95.qt qml-诺谦通用可扩展多功能QML界面

如下图所示:自带一个功能界面,可以通过功能界面添加不同功能,并且可以固定到顶部水平导航栏中,对于N多小功能的项目而言,非常方便,这样用户就可以根据自己喜好来使用自己常用的功能了。

抵抗时间扭曲,坚持做一件有意义的事 3048

银河麒麟编译libjpeg库并配置qt环境

银河麒麟下编译libjpeg库并配置qt环境验证

小米的修行之路 1015

Android的事件传递机制

事件传递顺序捕获(从上到下) -> 目标处理 -> 冒泡(从下到上)。:负责分发,是整个机制的入口和控制器。ViewGroup特有,在捕获阶段决定是否拦截事件。:负责处理事件,其 返回值是决定事件是否继续冒泡的关键:true:我处理了,事件到此为止。false:我不处理,谁爱处理谁处理(交给父 View)。

m0_74910897的博客 920

UG NX二次开发(C#)-VS2022配置NX二次开发模板不能正常显示的问题

随着VS2022的发布,使用VS2022进行UG NX二次开发的人员也会越来越多,但是由于VS2022和以前的VS版本采用代码结构不同,而UG NX的二次开发编程模板还没有适应于VS2022的模板配置,所以不能正常的创建一个完整的工程。本文采用曲线救国的方式来实现VS2022下的UG NX二次开发。如果有读者能很好的解决模板配置,不吝赐教。

GimiGimmy 4276

android的事件传递机制,一张图看清Android事件传递机制

一、引言总觉得知识必须要总结,不然就算再熟悉的东西,一段时间不接触就容易遗忘;上次给一个朋友解释回调的时候就有深刻的体会,所以现在养成总结的习惯,而我觉得最直观的方法就是图解,所以就有了下面的图,通过这张图看透Android事件传递机制;PS:有时候自己的理解可能也存在问题,所以通过这种形式能够得到大家的审查和修改意见,在这里先谢谢大家了!二、就是这张图(这张图如果看不清楚,复制或保存本地,使用图...

weixin_35639230的博客 423

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Android Touch事件的传递机制

android中会经常遇到多个View ViewGroup嵌套的问题,如果想要快速的解决这种问题,就需要对View的事件传递有较深入的理解。一次完整的事件传递机制,主要是三个阶段,分别是事件的分发,拦截和消费。 1.1 触摸事件的主要类型 触摸事件对应的是MotionEvent类,事件的类型主要有如下三种。 ACTION_DOWN:用户手指按下的操作,一个按下操作标志着一次触摸事件的开始。 ACT

论一个程序员的自我修养 1374

数学建模模型总结

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

Android中事件传递机制的总结

Android中事件传递机制总结

qq_34358193的博客 1572

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

android点击事件传递机制,android事件传递机制测试分析

情景:activity-viewGroup-|ChildViewUp(ChildUp)(叠在上面的view)|ChildViewDown(ChildDown)(叠在下面的view)注:1、以下事件如果不特指均为onTouchEvent2、如果onTouchListener没有设置,onTouchEvent是事件真正处理和消费的位置3、该情景用于描述事件传递的基本单元,更加复杂的结构都可以由该情景组...

weixin_35750483的博客 899

android事件传递机制

事件传递顺序 Activity--> Window-->DecorView --> 布局View 或者说以上顺序是事件在应用层的传递顺序。如果要说整个事件的传递机制,是Android底层收到触摸屏的事件后,使用socket跨进程通信,用InputDispatcher将事件发送给APP进程,由主线程的Looper去取出消息进行处理。 本文主要分析Android应用层的一个传递过程 事件的传递规则 一个点击事件,或者说触摸事件,被封装为了一个MotionEvent。事件的分发主要由三个重要

y2015的博客 345

android 按钮焦点事件,Android焦点事件分发与传递机制

如果您对TouchEvent事件分发机制不太了解的,可以参考我的这篇文章——安卓TounchEvent事件分发机制。问题:TV端焦点满天飞,如何解决和处理?记得初入TV开发,以为很简单。TV的这些界面与布局太简单了,分分钟就可以把页面搭建出来,处理好,然后就没有然后了。。。。下面我们就从源码来带大家进行安卓TV焦点事件的传递这里先给出Android系统View的绘制流程:依次执行View类里面的如...

weixin_42099633的博客 592

Android 事件传递机制

Android的事件:onClick, onScroll, onFling等等,都是由许多个Touch组成的。其中Touch的第一个状态肯定是ACTION_DOWN, 表示按下了屏幕。之后,touch将会有后续事件,可能是: · ACTION_MOVE //表示为移动手势 · ACTION_UP //表示为离开屏幕 · ACTION_CANCEL //表示取消手势,不会由用户产生,而是由程序

LIAN_1988的专栏 1013

深入浅出解析Android事件传递机制

转载:https://www.cnblogs.com/Seanisme/articles/6180510.html 读完这一篇收获满满 关于Android中的事件传递,在Android系统源代码层级的实现上非常复杂,而对于应用程序的开发而言,我们不必深究太多细节,只需要掌握事件传递机制所带来的一些结论即可。本文通过父控件→子控件的事件模型来聊聊关于事件传递机制的一些知识点。   在开始分析...

Wubo的博客 184

Android 中Touch(触屏)事件传递机制

一、基本概念 在实际开发中,经常会遇到与触屏事件有关的问题,最典型的一个就是滑动冲突。比如在使用SliddingMenu菜单的时候,可能会与ViewPager或者其他的一些带有滑动事件的View相冲突,再比如ScrollView嵌套ListView相冲突等等。还有就是在自定义控件的时候,需要处理一些事件时候,也必须把逻辑处理好,父 view 和子view 都需要接收事件,然后处理。如果不明白

LIAN_1988的专栏 2144

Android TouchEvent 事件传递机制简单理解

Android事件传递机制是一个常用的知识点,在看过很多资料后,我也记录下我对事件传递机制的理解。 Android事件传递机制就是当一个触摸事件发生后,从一个窗口到另一个视图,再到另一个视图直到被消费的过程。

禽兽先生不禽兽 1693

android事件传递机制详解

在Android中,事件主要包括点按、长按、拖拽、滑动等,点按又包括单击和双击,另外还包括单指操作和多指操作。所有这些都构成了Android中得事件响应。总的来说,所有的事件都由如下三个部分作为基础: 按下(ACTION_DOWN) 移动(ACTION_MOVE) 抬起(ACTION_UP) 所有的操作事件首先必须执行的是按下操作(ACTION_DOWN),之后所有的操作都是以

牛召功的博客 1055
上一篇: Linux内核的Makefile和kconfig解读
下一篇: Ubuntu Server 意外断电
dadahacker
博客等级 码龄20年 78粉丝 120原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值