0
点赞
收藏
分享

微信扫一扫

安卓重要知识点7

WMS 与 InputManagerService 的输入事件协作 用户与 Android 设备的交互(如触摸、按键、手势)通过输入事件完成,而输入事件从硬件到应用的分发过程,依赖 WMS(WindowManagerService)与 InputManagerService(IMS)的紧密协作。WMS 负责确定事件目标窗口,IMS 负责事件采集与传递,二者共同保障输入响应的准确性与及时性。 输入事件的生命周期 输入事件从产生到被应用处理需经历以下阶段: 1. 事件采集(IMS 负责): • 底层驱动(如触摸屏驱动)将硬件事件(如触摸坐标、按键代码)传递给 Linux 输入子系统。 • IMS 的 InputReader 线程读取输入事件,转换为 Android 标准事件(如 MotionEvent、KeyEvent),并发送至 InputDispatcher 线程。 2. 目标窗口确定(WMS 负责): • InputDispatcher 向 WMS 发送事件查询请求,获取当前应接收事件的窗口。 • WMS 根据以下规则确定目标: • 可见性:仅可见窗口可接收事件(WindowState.isVisible())。 • 层级与坐标:通过事件坐标(如触摸点)与窗口布局信息,找到层级最高且包含该坐标的窗口(findTouchedWindow())。 • 焦点状态:对于按键事件,优先发送给拥有焦点的窗口(mFocusedWindow),由 WMS 维护焦点状态(如点击窗口时设置焦点)。 3. 事件分发(IMS 与应用协作): • IMS 的 InputDispatcher 根据 WMS 返回的目标窗口,通过 Binder 调用应用侧 ViewRootImpl 的 dispatchInputEvent() 方法。 • 应用侧通过 View 树传递事件(dispatchTouchEvent()),触发对应回调(如 onClick()),并将处理结果反馈给 IMS。 WMS 与 IMS 的协作机制 1. 窗口状态同步: • WMS 维护窗口的可见性、焦点状态、坐标范围等信息,当这些状态变化时(如窗口移动、焦点切换),通过 InputMonitor 接口同步给 IMS,确保 InputDispatcher 掌握最新窗口状态。 • 例如,当新窗口覆盖旧窗口时,WMS 通知 IMS 屏蔽旧窗口的输入事件,避免事件误传。 2. 事件拦截与处理: • 系统级事件(如 Home 键、电源键)由 IMS 直接拦截,传递给 PolicyManager 处理(如 Home 键触发返回桌面)。 • 应用可通过 WMS 请求拦截特定事件(如手势导航),WMS 与 IMS 协同将事件优先发送给拦截者(如系统导航栏)。 3. 触摸反馈与动画: • WMS 接收事件后,可触发窗口反馈(如触摸高亮),通过窗口动画系统生成视觉反馈。 • 对于滑动事件(如窗口拖动),WMS 实时更新窗口位置,并同步给 IMS 调整后续事件的目标判断。 性能与可靠性保障 • 事件优先级:IMS 对输入事件按类型设置优先级(如按键事件高于触摸事件),确保关键操作(如紧急拨号)优先响应。 • 超时处理:若应用处理事件超时(如 500ms 未返回),IMS 标记窗口为无响应(ANR),并通知 AMS 弹出 ANR 对话框。 • 多显示器支持:对于外接显示器,WMS 与 IMS 按显示器区分窗口与事件,确保事件发送到正确屏幕的窗口。 WMS 与 IMS 的协作是 Android 输入系统的核心,通过明确的职责划分(WMS 管目标,IMS 管传递)与实时状态同步,确保用户操作准确映射到界面响应,是交互体验流畅性的关键保障。

举报

相关推荐

0 条评论