Android焦点机制结合WMS

2024-06-20 04:52
文章标签 android 结合 机制 焦点 wms

本文主要是介绍Android焦点机制结合WMS,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章前提:

  • 了解WMS基本作用
  • 了解window的概念,phoneWindow,rootViewImpl
  • 了解view的事件分发

开始:

讲三件事情:

  1. window的创建,更新
  2. 焦点的更新
  3. 事件的分发

Window的创建,更新:

window的创建:

最终都是通过和WMS通信完成的。

WMS管理着window的增,删,改以及window层级的管理(Z-order的堆栈管理...),因此window的创建我们自然就联想到了WMS。

performLaunchActivity()方法中,也就是在 Activity 的启动过程中的几乎最后一步执行:

调用activity.attch()方法

 

创建PhoneWindow

handleResumeActivity()处理onResume(),因此在performLaunchActivity后面执行在这个方法中调用了addView方法:

这个addView由WindowManagerGloal实现,其中创建RootViewImpl,并进行setView()

WindowManagerGloal:

这个root就是RootViewImpl,接下来到setView方法中

通过addToDisPlayAsUser方法调用,

在其中调用WMS的addWindow方法:

此时终于到了WMS的addWindow方法中,这里面做了四件事:

  • 窗口检查
  • token处理
  • windowState的创建
  • displayContent的创建和配置

执行完后,由WMS直接和SurfaceFlinger通信,进行显示,此时我们的window就显示出来了。

window的更新:

什么情况下会出现window的更新?

键盘出现,窗口需要重新计算布局并更新显示内容。

只是api执行的不同,不过逻辑同样,app进程发起更新请求,由WindowManagerGlobal进行处理,这个类和WMS通过IWindowSession进行通信,实现更新操作。

焦点的更新:

焦点的基本概念

  • 焦点(Focus):UI元素获得焦点后,能够接收用户输入事件,如按键和触摸事件。
  • 默认焦点:当一个Activity启动时,系统会自动为某个可交互的控件设置默认焦点。

焦点的获取和失去

  • 获取焦点:一个视图可以通过调用requestFocus()方法来请求获取焦点。
  • 失去焦点:一个视图可以通过调用clearFocus()方法来主动放弃焦点。

焦点的移动

  • 键盘导航:用户可以使用方向键(如上、下、左、右)在可获得焦点的视图之间导航。
  • Tab顺序:使用android:nextFocusUp, android:nextFocusDown, android:nextFocusLeft, android:nextFocusRight属性来指定焦点导航的顺序。

处理焦点冲突

  • focusable属性的合理使用:确保只有需要交互的视图设置为可获得焦点。
  • 自定义焦点顺序:通过XML属性或代码来明确设置焦点导航顺序,避免焦点在不合理的视图之间跳转。

OK,开始焦点机制的部分:

文章前提:

  • 了解InputManagerService
  • 了解WMS
  • 了解RootViewImpl

想要使得焦点更新,需要操作:

分为两种:

  • requestFocus()
  • 有外部点击

requestFocus:

会通过Binder,通过WMS,WMS中会判断焦点是否更新。

外部点击:

SurfaceFlinger接收到点击之后,通过InputChannel,发送给WMS,WMS内持有所有window的集合,会判断是否需要更新window焦点,通过WMS,surfaceFlinger得知需要更新的window之后,直接通知对应的window的RootViewImpl,通知DecorView,通知Activity,通知PhoneWindow,通知DecorView,然后继续向下分发......下面就是老生常谈的view事件分发机制了......

这篇关于Android焦点机制结合WMS的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1077151

相关文章

Redis客户端连接机制的实现方案

《Redis客户端连接机制的实现方案》本文主要介绍了Redis客户端连接机制的实现方案,包括事件驱动模型、非阻塞I/O处理、连接池应用及配置优化,具有一定的参考价值,感兴趣的可以了解一下... 目录1. Redis连接模型概述2. 连接建立过程详解2.1 连php接初始化流程2.2 关键配置参数3. 最大连

Android Paging 分页加载库使用实践

《AndroidPaging分页加载库使用实践》AndroidPaging库是Jetpack组件的一部分,它提供了一套完整的解决方案来处理大型数据集的分页加载,本文将深入探讨Paging库... 目录前言一、Paging 库概述二、Paging 3 核心组件1. PagingSource2. Pager3.

Spring Security 单点登录与自动登录机制的实现原理

《SpringSecurity单点登录与自动登录机制的实现原理》本文探讨SpringSecurity实现单点登录(SSO)与自动登录机制,涵盖JWT跨系统认证、RememberMe持久化Token... 目录一、核心概念解析1.1 单点登录(SSO)1.2 自动登录(Remember Me)二、代码分析三、

Go语言并发之通知退出机制的实现

《Go语言并发之通知退出机制的实现》本文主要介绍了Go语言并发之通知退出机制的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1、通知退出机制1.1 进程/main函数退出1.2 通过channel退出1.3 通过cont

Spring Boot 中的默认异常处理机制及执行流程

《SpringBoot中的默认异常处理机制及执行流程》SpringBoot内置BasicErrorController,自动处理异常并生成HTML/JSON响应,支持自定义错误路径、配置及扩展,如... 目录Spring Boot 异常处理机制详解默认错误页面功能自动异常转换机制错误属性配置选项默认错误处理

Java中的xxl-job调度器线程池工作机制

《Java中的xxl-job调度器线程池工作机制》xxl-job通过快慢线程池分离短时与长时任务,动态降级超时任务至慢池,结合异步触发和资源隔离机制,提升高频调度的性能与稳定性,支撑高并发场景下的可靠... 目录⚙️ 一、调度器线程池的核心设计 二、线程池的工作流程 三、线程池配置参数与优化 四、总结:线程

Spring Boot 结合 WxJava 实现文章上传微信公众号草稿箱与群发

《SpringBoot结合WxJava实现文章上传微信公众号草稿箱与群发》本文将详细介绍如何使用SpringBoot框架结合WxJava开发工具包,实现文章上传到微信公众号草稿箱以及群发功能,... 目录一、项目环境准备1.1 开发环境1.2 微信公众号准备二、Spring Boot 项目搭建2.1 创建

nginx -t、nginx -s stop 和 nginx -s reload 命令的详细解析(结合应用场景)

《nginx-t、nginx-sstop和nginx-sreload命令的详细解析(结合应用场景)》本文解析Nginx的-t、-sstop、-sreload命令,分别用于配置语法检... 以下是关于 nginx -t、nginx -s stop 和 nginx -s reload 命令的详细解析,结合实际应

SpringBoot结合Docker进行容器化处理指南

《SpringBoot结合Docker进行容器化处理指南》在当今快速发展的软件工程领域,SpringBoot和Docker已经成为现代Java开发者的必备工具,本文将深入讲解如何将一个SpringBo... 目录前言一、为什么选择 Spring Bootjavascript + docker1. 快速部署与

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期