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

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

文章前提: 了解WMS基本作用了解window的概念,phoneWindow,rootViewImpl了解view的事件分发 开始: 讲三件事情: window的创建,更新焦点的更新事件的分发 Window的创建,更新: wi…...

Hive分区和分桶

分区: 根据某一列进行进行划分存储,常用的有时间分区; 查询数据时只需要扫描特定的分区数据,不需要全盘扫描,节省时间, 方便数据归档和清理 创建分区表 create table table_name( col1 int, col2 string ) partition …...

GPT-5的到来~

IT之家6月22日消息,在美国达特茅斯工程学院周四公布的采访中,OpenAI首席技术官米拉穆拉蒂被问及GPT-5是否会在明年发布,给出了肯定答案并表示将在一年半后发布。此外,穆拉蒂在采访中还把GPT-4到GPT-5的飞跃描述为高中生到博士生的成长。“像 GPT-4 这样的系统则更像是聪明的…...

责任链模式(设计模式)

责任链模式(Chain of Responsibility Pattern)是一种行为设计模式,它允许多个对象有机会处理请求,从而避免请求的发送者和接收者之间的耦合。将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理…...

计算机图形学入门20:加速光线追踪

1.前言 前文说了Whitted-style光线追踪技术的原理以及光线与平面的交点计算方式,对于现在应用最广的Polygon Mesh显式曲面来说,一个复杂场景中的多边形面总数可能达到千万甚至亿万以上,如果每个像素发射光线都和场景中每个平面进行求交点计算…...

sys.stdin对象——实现标准输入

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 语法参考 sys.stdin是一个标准化输入对象,可以连续输入或读入文件所有内容,不结束,不能直接使用。输入完成后&am…...

嵌入式项目分享| 终极智能手表,全过程+全开源分享

这是一个非常完整的智能手表开源项目,功能齐全,且资料开源,如果你是:自己平时喜欢diy的工程师,想要提升开发技能的学生,马上要做毕设的大四学生,这个手表很值得一做,别错过了~~ 所有开源的资料以及原文链接见文末。 先来看下这个手表的功能: 首先,是一个可以佩戴的手…...

【Linux详解】进程的状态 | 运行 阻塞 挂起 | 僵尸和孤儿状态

目录 操作系统中 运行状态 阻塞状态 进程状态转换 Linux系统中 查看进程状态 深度睡眠状态 T 暂停状态 Z 僵尸状态 孤儿状态 文章手稿 xmind: 引言 介绍系统中的进程状态及其管理方式。将通过结合操作系统原理和实际代码示例,详细说明进程的各种状态、转换…...

MySQL添加外键约束经典案例

1DDL建表语句 需要一个emp员工表和一个dept部门表 CREATE TABLE emp (id int NOT NULL AUTO_INCREMENT,name varchar(50) COLLATE utf8mb4_0900_as_ci NOT NULL COMMENT 姓名,age int DEFAULT NULL COMMENT 年龄,job varchar(20) COLLATE utf8mb4_0900_as_ci DEFAULT NULL CO…...

vue3监听器watch以及watchEffect的使用

一,watch()简介: 侦听一个或多个响应式数据源,并在数据源变化时调用所给的回调函数 watch()默认是懒侦听的,即仅在侦听源发生变化时才执行回调函数。 watch()一共有三个参数 第一个参数:侦听器的源,可以为以…...

modelsim做后仿真的一点思路

这是以TD_5.6.3_Release_88061生成的网表文件(其他工具生成的网表文件类似),与modelsim联合进行门级仿真的样例,时序仿真与门级仿真的方法类似,只是增加了标准延时文件。 1、建立门级仿真工程 将门级网表和testbench添…...

如何获取特定 HIVE 库的元数据信息如其所有分区表和所有分区

如何获取特定 HIVE 库的元数据信息如其所有分区表和所有分区 1. 问题背景 有时我们需要获取特定 HIVE 库下所有分区表,或者所有分区表的所有分区,以便执行进一步的操作,比如通过 使用 HIVE 命令 MSCK REPAIR TABLE table_name sync partiti…...

如何在 qmake(QtCreator)中指定 Mac 平台

在 Qt 项目文件(.pro 文件)中设置针对 Mac OS 的配置项。通常情况下,我们可以使用如下方式为 Windows 和 Unix 系统分别添加源文件: win32 {SOURCES += hellowin.cpp } unix {SOURCES += hellounix.cpp }虽然 Mac OS 是类 Unix 系统,但有时我们仍然需要区分它和 Linux 系…...

day39动态规划part02| 62.不同路径 63. 不同路径 II 343. 整数拆分 (可跳过)96..不同的二叉搜索树 (可跳过)

**62.不同路径 ** 本题大家掌握动态规划的方法就可以。 数论方法 有点非主流,很难想到。 题目讲解 | 视频讲解 class Solution { public:int uniquePaths(int m, int n) {// 确定数组及其下标的含义int dp[101][101] {0}; //到达i,j的点有多少条路径// 确定递推…...

声场合成新方法:基于声波传播的框架

声场合成是指在房间内的麦克风阵列上,根据来自房间内其他位置的声源信号,合成每个麦克风的音频信号。它是评估语音/音频通信设备性能指标的关键任务,因为它是一种成本效益高的方法,用于数据生成以替代真实的数据收集,后…...

鸿蒙文件操作事前准备

13900001,沙箱13900002 首选授权 module授权配置 "requestPermissions": [{ "name": "ohos.permission.CAMERA",}, { "name": "ohos.permission.READ_MEDIA",}, { "name": "ohos.permission.WR…...

AI智能时代:ChatGPT如何在金融市场发挥策略分析与预测能力?

文章目录 一、ChatGPT在金融策略制定中的深度应用客户需求分析与定制化策略市场动态跟踪与策略调整策略分析与优化 二、ChatGPT在算法交易中的深度应用自动交易策略制定交易执行与监控风险管理 三、未来展望《智能量化:ChatGPT在金融策略与算法交易中的实践》亮点内…...

C#面:C#属性能在接口中声明吗?

在C#中,接口是一种定义了一组方法、属性和事件的类型。在接口中,只能声明方法、属性和事件的签名,而不能包含字段、构造函数或实现代码。因此,C#属性不能直接在接口中声明。 然而,你可以在接口中定义属性的签名&#…...

区块链的历史和发展:从比特币到以太坊

想象一下,你住在一个小镇上,每个人都有一个大账本,记录着所有的交易。这个账本很神奇,每当有人买卖东西,大家都会在自己的账本上记一笔,确保每个人的账本都是一致的。这就是区块链的基本思想。而区块链的故…...

input()函数——输入

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 语法参考 input()函数可以提示并接收用户的输入,将所有的输入按照字符串进行处理,并返回一个字符串,input()函数的…...

Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析

Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问(基础概念问题) 1. 请解释Spring框架的核心容器是什么?它在Spring中起到什么作用? Spring框架的核心容器是IoC容器&#…...

LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》

这段 Python 代码是一个完整的 知识库数据库操作模块,用于对本地知识库系统中的知识库进行增删改查(CRUD)操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 📘 一、整体功能概述 该模块…...

uniapp 小程序 学习(一)

利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 :开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置,将微信开发者工具放入到Hbuilder中, 打开后出现 如下 bug 解…...

go 里面的指针

指针 在 Go 中,指针(pointer)是一个变量的内存地址,就像 C 语言那样: a : 10 p : &a // p 是一个指向 a 的指针 fmt.Println(*p) // 输出 10,通过指针解引用• &a 表示获取变量 a 的地址 p 表示…...

Docker拉取MySQL后数据库连接失败的解决方案

在使用Docker部署MySQL时,拉取并启动容器后,有时可能会遇到数据库连接失败的问题。这种问题可能由多种原因导致,包括配置错误、网络设置问题、权限问题等。本文将分析可能的原因,并提供解决方案。 一、确认MySQL容器的运行状态 …...

基于鸿蒙(HarmonyOS5)的打车小程序

1. 开发环境准备 安装DevEco Studio (鸿蒙官方IDE)配置HarmonyOS SDK申请开发者账号和必要的API密钥 2. 项目结构设计 ├── entry │ ├── src │ │ ├── main │ │ │ ├── ets │ │ │ │ ├── pages │ │ │ │ │ ├── H…...

Android写一个捕获全局异常的工具类

项目开发和实际运行过程中难免会遇到异常发生,系统提供了一个可以捕获全局异常的工具Uncaughtexceptionhandler,它是Thread的子类(就是package java.lang;里线程的Thread)。本文将利用它将设备信息、报错信息以及错误的发生时间都…...

数据结构第5章:树和二叉树完全指南(自整理详细图文笔记)

名人说:莫道桑榆晚,为霞尚满天。——刘禹锡(刘梦得,诗豪) 原创笔记:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 上一篇:《数据结构第4章 数组和广义表》…...

用js实现常见排序算法

以下是几种常见排序算法的 JS实现,包括选择排序、冒泡排序、插入排序、快速排序和归并排序,以及每种算法的特点和复杂度分析 1. 选择排序(Selection Sort) 核心思想:每次从未排序部分选择最小元素,与未排…...

理想汽车5月交付40856辆,同比增长16.7%

6月1日,理想汽车官方宣布,5月交付新车40856辆,同比增长16.7%。截至2025年5月31日,理想汽车历史累计交付量为1301531辆。 官方表示,理想L系列智能焕新版在5月正式发布,全系产品力有显著的提升,每…...