博客
关于我
反思|Android 事件分发机制的设计与实现
阅读量:786 次
发布时间:2019-03-24

本文共 1391 字,大约阅读时间需要 4 分钟。

Android事件分发机制深度解析

Android系统的事件分发机制是其完整性和灵活性的重要体现。本文将从系统启动流程、输入管理、事件分发机制等多个方面,详细阐述Android事件分发的核心设计思想及其实现方法。

系统启动流程

Android系统启动时,SystemServer进程会启动多个关键系统服务,包括WindowManagerServiceInputManagerServiceWindowManagerService负责管理窗口显示,while InputManagerService则负责接收和处理硬件输入事件。

InputManagerService通过与Native层的InputManager建立通信,监控键盘消息。这一机制确保了系统能够及时响应用户的输入操作。

输入事件分类

Android定义了InputEvent作为输入事件的基类,其子类包括KeyEventMouseEvent

  • KeyEvent:处理键盘输入事件。
  • MouseEvent:处理触摸屏输入事件,如手指、笔、触控板等。

这种分类使得输入系统能够统一处理多种输入设备的事件。

输入管理器

InputManager是Android系统的关键组件,它在Native层接收输入事件,并将事件分发给当前激活的窗口。InputManager通过InputChannelViewRootImpl建立通信,确保输入事件能够流向应用层。

ViewRootImpl作为窗口服务与UI之间的纽带,负责将输入事件分发到应用程序中的View层。

事件分发机制

事件分发机制采用了责任链模式,通过递归思想将事件沿着View树传递到合适的消费者。每个事件最多只有一个消费者,保证了事件处理的唯一性。

InputStage:事件分发的分阶段处理

Android引入了InputStage接口,作为事件分发的分阶段基类。其子类,如SyntheticInputStageViewPostImeInputStage等,负责处理不同阶段的输入事件:

  • SyntheticInputStage:处理综合性输入,如轨迹球和导航面板。
  • ViewPostImeInputStage:UI层面的事件分发,主要处理手指触摸和按键事件。

这些阶段通过责任链组装,确保每个事件在适当的阶段被正确处理。

ViewRootImpl:窗口服务与UI的交互

ViewRootImpl负责将系统输入事件传递给应用程序的View层。它通过InputChannel与系统服务进行通信,并在ViewPostImeInputStage阶段开始UI层的事件分发流程。

UI层的事件分发

UI层的事件分发遵循递归思想,每个ViewGroup通过dispatchTouchEvent方法将事件传递给子View。这一流程以View自身的dispatchTouchEvent方法为终点,决定事件是否被消费。

事件拦截机制

为了增强灵活性,Android为ViewGroup提供了拦截事件的机制。通过重写onInterceptTouchEvent函数,开发者可以在事件分发前中止事件传递,满足特定需求,如滑动冲突处理。

总结

Android的事件分发机制以递归思想为核心,通过责任链实现多阶段事件处理。其灵活性和完整性为开发者提供了强大的工具,满足各种复杂场景的需求。

转载地址:http://ttlkk.baihongyu.com/

你可能感兴趣的文章
Node-RED中使用Notification元件显示警告讯息框(温度过高提示)
查看>>
Node-RED中使用range范围节点实现从一个范围对应至另一个范围
查看>>
Node-RED中实现HTML表单提交和获取提交的内容
查看>>
Vue3+elementplus实现图片上传下载(最强实践)
查看>>
Node-RED中将CSV数据写入txt文件并从文件中读取解析数据
查看>>
Node-RED中建立TCP服务端和客户端
查看>>
Node-RED中建立Websocket客户端连接
查看>>
Node-RED中建立静态网页和动态网页内容
查看>>
Vue3+Element-ul学生管理系统(第二十二课)
查看>>
Node-RED中怎样让网站返回JSON数据
查看>>
Node-RED中根据HTML文件建立Web网站
查看>>
Node-RED中解析高德地图天气api的json数据显示天气仪表盘
查看>>
Node-RED中连接Mysql数据库并实现增删改查的操作
查看>>
Node-RED中通过node-red-ui-webcam节点实现访问摄像头并截取照片预览
查看>>
Node-RED中配置周期性执行、指定时间阶段执行、指定时间执行事件
查看>>
Node-RED安装图形化节点dashboard实现订阅mqtt主题并在仪表盘中显示温度
查看>>
Node-RED怎样导出导入流程为json文件
查看>>
Node-RED简介与Windows上安装、启动和运行示例
查看>>
Node-RED订阅MQTT主题并调试数据
查看>>
Node-RED通过npm安装的方式对应卸载
查看>>