当前位置: 首页 > news >正文

Android事件分发机制

目录

一、Android事件分类

二、InputChannel 注册:

三、底层读取与分发机制

四、按键分发机制:

五、触摸事件分发机制

六、ANR


一、Android事件分类


1.键盘输入;
2.触摸事件:



参考链接:

键盘输入事件: Android应用程序键盘(Keyboard)消息处理机制分析

android 8按键事件分发机制:Android8.0 按键事件处理流程


二、InputChannel 注册:


1.InputReader 循环从 /dev/input/下的硬件节点中读信息, InputDispatcher 分发消息;
2.ViewRootImpl.setView 中会创建InputChannel 来监听输入事件;
InputManager.setInputWindows 设置当前获取焦点的Window
WindowManagerService.addWindow中通过InputChannel.openInputChannelPair创建一对输入通道,其中一个位于WindowManagerService(server端)中,另外一个通过outInputChannel参数返回到应用程序中(client端)。
InputManager.registerInputChannel 注册InputChannel(将server端注册到InputManager),最终通过InputDispatcher.registerInputChannel实现注册。

2.1 InputReader 为啥不堵塞线程

Epoll (I/O 多路复用),无事件时,Linux 内核会将该线程挂起(阻塞),让出 CPU 时间片;

多线程解耦:InputReader负责读取事件;InputDispatcher 负责分发;

WakeFds唤醒机制:在需要主动唤醒InputReader的场景下,当需要中断当前的epoll_wait()阻塞状态时,系统会向wakeFds写入数据,epoll监听到该文件描述符有活动从而强制唤醒线程,而不必死等外部输入。


三、底层读取与分发机制

按键与触摸底层逻辑大致相同,仅少数地方有说差别。
1. InputReader.pollOnce
2. EventHub.getEvent
3. InputReader.process
4. InputReader.consumeEvent
5. InputDevice.process
6. KeyboardInputMapper.process
7. KeyboardInputMapper.processKey
8.InputDispatcher.notifyKey--Policy->interceptKeyBeforeQueueing(可供PhoneWindowManager去处理HOME键等特殊按键)--
InputDispatcher.dispatchKeyLocked--dispatchEventToCurrentInputTargetsLocked
ViewRootImpl.enqueueInputEvent--doProcessInputEvents--deliverInputEvent--stage.deliver--apply(NativePreImeInputStage,其是由ViewPreImeInputStage,ImeInputStage,EarlyPostImeInputStage,NativePostImeInputStage,ViewPostImeInputStage,SyntheticInputStage作为嵌套参数构成的,所以调用NativePreImeInputStage的deliver(q),会依次调用到每个InputState的子类的 onProcess()方法)---主要是ViewPostImeInputStage.onProcess

四、按键分发机制:


ViewPostImeInputStage.processKeyEvent(这里区分key或触摸事件)--mView(DecorView).dispatchKeyEvent--Activity.dispatchKeyEvent--PhoneWindow.dispatchKeyEvent--ViewGroup.dispatchKeyEvent--View.dispatchKeyEvent


五、触摸事件分发机制

ViewRootImpl.ViewPostImeInputStage.processPointerEvent--deliverPointerEvent--mView.dispatchPointerEvent(该View是Decor.View)--PhoneWindow.dispatchTouchEvent--Activity.dispatchTouchEvent--ViewGroup.dispatchTouchEvent--onInterceptTouchEvent--onTouchEvent

注意事项

  1. down事件被一个view拦截后,后面的move、up也会被该View处理 。
  2. onTouchListener 中的onTouch 优先级高于onTouchEvent, 倘若onTouchListener中的onTouch方法返回true,onTouchEvent会收不到消息。
  3. 执行顺序:onTouch, onTouchEvent, onClick。onclick 依赖于onTouchEvent.

六、ANR

ANR学习总结

http://www.jsqmd.com/news/1071204/

相关文章:

  • PyVirtualDisplay完整指南:Xvfb、Xephyr和Xvnc三大后端深度解析
  • 深度解析MatchZoo与Awesome Neural Models for Semantic Match的集成应用
  • 如何快速入门Firo:隐私加密货币新手必备的完整指南
  • 3步实现企业微信客户资源零流失:从业务痛点到技术落地的完整策略
  • 从零到精通:如何用Intel RealSense SDK构建高精度三维视觉应用
  • 如何用Sing-Guard-4b构建安全的AI对话系统?完整案例演示
  • CANN/ge DataFlow Python注册函数指南
  • TeamSpeak 6 Server Docker部署终极指南:SQLite与MariaDB双数据库实战方案
  • ComfyUI-LTXVideo终极指南:5步实现专业级AI视频生成
  • CANN/catlass小形状矩阵乘法示例
  • JoyAI-Image-Edit-Plus-Diffusers未来路线图:AI图像编辑技术发展趋势
  • cann/runtime随机数生成示例
  • 002 使用单片机实现的逻辑分析仪——扩展篇
  • find、stat、touch、tree、scp、crontab指令相关应用
  • 5个实用技巧:用TimetableLayout打造专业级Android时间表应用
  • 性能优化秘籍:TP=2 vs TP=4配置对比,找到最佳GPU资源利用方案
  • TruecallerJS API深度解析:如何构建专业的电话号码验证系统
  • 解锁Java生态宝藏:从零构建企业级知识图谱的技术架构深度剖析
  • 98个公共Tracker完整指南:彻底解决BT下载卡顿难题
  • Bernini-R-GGUF-ComfyUI核心功能解析:为什么它是视频创作者的终极工具
  • ComfyUI-LTXVideo完整指南:如何在ComfyUI中轻松生成高质量AI视频
  • TruecallerJS实战应用:10个真实场景下的电话号码查询解决方案
  • CANN运行时设备到主机同步内存复制示例
  • Gemma-4-31B-StyleTune vs 传统微调:终极VRAM需求对比分析
  • 5个实战项目:用Deep Learning Illustrated代码构建深度学习应用
  • Open3D (C++) 三维轨迹点的等间距三次样条平滑与插值(间距可控)
  • Sapiens2-Pose-0.4B vs 其他姿态估计模型:为什么它是最佳选择?[特殊字符]
  • CANN ops-nn ApplyAdagradD算子
  • Edge-TTS终极指南:专业诊断与高效解决语音合成错误的完整方案
  • CANN/PTO-ISA SET_QUANT_VECTOR指令