Android 12系统源码_输入系统(一)认识Android的输入系统

news2024/9/30 23:08:17

前言

问渠那得清如许,为有源头活水来。对于大多数现代操作系统中,“事件”就是它们的“活水源头”,正是在“事件和消息”的不断产生、流转和处理中,整个软件系统才能“动”起来。

Android系统有一套从底层Linux内核到上层应用程序完整的消息产生、投递及处理机制——这同时也是外界与Android设备交互的基
础。对于系统层的开发人员而言,经常要根据具体的硬件配置来扩展、修改和完善消息处理机制,因而深入理解其中的实现原理就显
得异常重要。

一、输入事件

首先应该明白一个问题——什么是“事件”?从广义上来说,事件的发生源分为“软件”与“硬件”两类,这里侧重于对后者的讨论。也就是说,它们是由真实物理硬件产生的消息,表明设备使用者的某种“意愿”。例如用户点击了触摸屏,而相应位置上是音乐播放器的“暂停”键,那么说明他希望暂停当前的音乐播放。

1.1 事件处理

如果从硬件设备角度来为Android系统中的事件分类,主要有以下几种。

  • 按键事件(KeyEvent)

由物理按键产生的事件。对于嵌入式设备,通常不会配备太多物理按键。比如手机一般只有Home、Back、Menu、Volume Up、Volume
Down和Camera等常用功能键。

  • 触摸事件(TouchEvent)

在触摸屏上点击、拖动,以及由它们的组合所产生的各种事件。这是Android系统中使用最广泛也是相对复杂的一种事件类型。根据Android项目经验,应用开发人员大部分的事件处理工作都和TouchEvent有关。

  • 鼠标事件(MouseEvent)

鼠标操作引起的事件,在嵌入式设备中并不常用。

  • 轨迹球事件(TrackBallEvent)

轨迹球基本已经被淘汰了。

1.2 事件抽象函数

这里我们结合Android系统中最常见的按键事件和触摸事件来做个简单的事件抽象设计,以便我们能更深刻的理解Android系统的事件设计思想。

1.2.1 按键事件

按键理论上只有两种状态要么按下,要么松开,即对应于KeyDown和KeyUp。r俺儿实际上却没这么简单,为什么呢?因为还有其他一些因素也是要考虑的,如长按、短按,或者按键组合(多个按键)的情况。比如我们在Windows操作系统中同时按Ctrl+Alt+Del组合键可以调出任务管理器,Android系统也同样支持这些操作。所以总结起来,影响一个按键事件的基础因素主要有以下几点:

  • 按键按下;
  • 按键松开;
  • 状态持续的长短;
  • 按键数量。

对其进行简单抽象,可以得到以下几个基础接口。

OnKeyDown();
onKeyUp();
onKeyLongPress();
onKeyMultiple();

1.2.2 触摸事件

触摸事件比按键事件要复杂一些。从用户的角度来看,正常的“触摸屏”设备既支持点击,也同时能“感应”滑动事件——这可以说是它和按键事件最大的区别。
在这里插入图片描述

  • 按住滑块;
  • 移动滑块;
  • 松开滑块。

以上动作将产生3种触摸事件,即:

  • 触摸点按下(TOUCH_DOWN);
  • 触摸点移动(TOUCH_MOVE);
  • 触摸点释放(TOUCH_UP)

值得一提的是,由MOVE事件还可以派生出其他的事件,如fling。应用程序为了模拟真实的世界,就必须遵循一定的物理现象。举个例
子,我们在地面上拖动一辆小车,放手后小车并不会马上停止,而是会继续向前再前进一段时间。应用到上面的解锁场景,就是当用户的
手势已经释放后(TOUCH_UP),滑块本身也不会马上停止,而是转化为fling事件继续执行一小段时间。这些细节是我们提供良好用户体的一个基础。
触摸事件相关的因素包括:

  • 触摸点状态(按下,松开);
  • 触摸点移动(移动的距离大小、速度等);
  • 触摸点的数量(需要“触摸屏”设备的支持,并不是所有设备都可以多点操作);
  • 时间因素(长按、短按等)。

对其进行简单抽象,可以得到以下几个基础接口。

onTouchDown(); 
onTouchUp();
onTouchMove();
onTouchLongPress();
onTouchMultiple();

1.3 事件抽象接口

针对所有事件的共性,我们需要提取一个统一的抽象接口,这就是InputEvent。从它的名称可以看出,Event属于I/O设备中的Input部分。
InputEvent
InputEvent下有两个子类,KeyEvent和MotionEvent。
InputEvent的子类
按键KeyEvent很容易理解,用于表达按键事件;而MotionEvent则是将所有能产生Movement的事件源进行统一管理,如Trackball、Finger、Mouse等。

二、输入事件的传递

输入事件传递流程主要可以分三部分,分别是输入系统部分、WMS处理部分、View处理部分。
输入系统

  • 输入系统部分
    包含输入子系统以及InputManagerService,用于事件的捕获以及分发给上一级

  • WindowManagerService处理部分
    输入系统部分将事件分发给对应的Window,而Window正是由WMS来管理的

  • View处理部分
    Android应用开发人员所熟知的View事件的传递机制,其实就属于这部分。

这里再提供一张更加详细的Android输入系统模型:
在这里插入图片描述
初看这张图可能有点不是很明白,待我们通过本系列文章完全认识了整个输入系统模块之后,再回来看这张图必然会有一种柳暗花明的感觉。

2.1 输入系统部分

输入系统说白了就是捕获事件,并将事件分发给WMS进行处理。关键字:事件捕获,事件分发 那系统是如何进行事件捕获和分发的呢?

输入系统在结构上又可以分为输入子系统和InputManagerService(简称IMS)

2.1.1 输入子系统

Android中的输入设备有很多种,如:键盘、触摸屏、鼠标,、游戏手柄等,Android应用开发中最常见的就是屏幕和按键了。当输入设备可用的时候,Linux内核会在/dev/input中创建对应的设备节点,当用户操作操作这些输入设备时会产生各种事件,比如按键事件、触摸事件、鼠标事件等;这些输入的原始信息会被Linux内核中的输入子系统采集,原始信息会经由内核空间(kernel space)的驱动层一直传递到用户空间(User space)的设备节点中。
输入子系统Android系统提供了getEvent和sendevent两个工具帮助开发者从设备节点读取输入事件和写入输入事件。

2.1.2 InputManagerService服务

InputManagerService服务所做的工作就是监听/dev/input下所有的设备节点,当设备节点有数据的时候会对数据进行二次甚至三次加工处理,并找到合适的窗口,将输入事件派发给它。

2.2 WMS处理部分

我们在Android 12系统源码_窗口管理(一)WindowManagerService的启动流程这篇文章中有讲过WindowManagerService的职责有四种。

在这里插入图片描述

WMS的职责之一就是输入系统的中转站,WMS作为窗口的管理者,会配合IMS将输入事件分配给合适的窗口来处理。

2.3 View处理部分

View的处理部分应该所Android应用开发人员最熟悉的部分了,一般情况下,输入事件最终会交给View来处理,应用开发人员可以通过一些回调方法轻松得到这个事件的封装类并对其进行处理,比如onTouchEvent(MotionEvent ev)方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2087476.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

合宙LuatOS产品规格书——Air780EQ

合宙Air780EQ, 基于移芯EC716E高端平台, 集成LTE 3GPP Release 13技术,确保高速、稳定的网络连接; 广泛兼容各大运营商网络,实现真正的全网通设计,提升产品市场适应性与灵活性。 Air780EQ 4G全网通模块核…

Unity(2022.3.41LTS) - 角色控制器和3D刚体

目录 一. 角色控制 二. 3D刚体 一. 角色控制 名称:功能:坡度限制将碰撞器限制为仅爬升比指示值更陡峭(以度为单位)的斜坡。步长偏移只有当楼梯离地面比指示值更近时,角色才会爬上楼梯。此值不应大于 Character Contr…

追求全能还是专精?——AI模型的未来趋势探讨

AI模型:追求全能还是专精? 近日,OpenAI预计在秋季推出代号为“草莓”的新AI。从专注于数学问题到处理主观营销策略,"草莓"模型展现出惊人的多样性。而这种全能型 AI 是否代表了未来趋势?相比专攻于某一领域的…

【离线查询 滑动窗口】2747. 统计没有收到请求的服务器数目

本文涉及知识点 离线查询 C算法:滑动窗口总结 LeetCode2747. 统计没有收到请求的服务器数目 给你一个整数 n ,表示服务器的总数目,再给你一个下标从 0 开始的 二维 整数数组 logs ,其中 logs[i] [server_id, time] 表示 id 为…

【Kafka】Windows下安装Kafka(全面)

目录 1.前提条件 2.下载 3.安装 4.环境变量配置 5.验证 1.前提条件 1.先安装zookeeper: 【Zookeeper】Windows下安装Zookeeper(全面)-CSDN博客https://blog.csdn.net/weixin_57259781/article/details/141679454 2.还需要安装scala: …

设计模式 -- 外观模式(Facade Pattern)

1 问题引出 组建一个家庭影院 DVD 播放器、投影仪、自动屏幕、环绕立体声、爆米花机,要求完成使用家庭影院的功能,其过程为: 直接用遥控器:统筹各设备开关 开爆米花机,放下屏幕 ,开投影仪 ,开音响&#xf…

坐牢第三十二天(c++)

一.作业 仿照string类&#xff0c;实现myString #include <iostream> #include <cstring> // 引入cstring以使用memcpy using namespace std; class myString {char *str; // 记录c风格的字符串int size; // 记录字符串的实际长度 public:// 无参构造myString():…

循环流网络的费用问题

循环流网络的费用问题 费用为负的网络流循环流网络的费用一些题目[UVa1659 Help Little Laura](https://onlinejudge.org/index.php?optioncom_onlinejudge&Itemid8&category24&pageshow_problem&problem4534)[Aizu-2230 How to Create a Good Game](https://…

[LLM][Prompt Engineering]:思维链(CoT)

思维链 思维链1. 思维链提示方法和增强策略1.1 简单的思维链提示1.2 示例形式的思维链提示1.3 思维链提示的后处理方案1.4 拓展推理结构 2. CoT的能力来源&#xff1a;为什么思维链提示能显著提升大语言模型在推理任务上的效果&#xff1f; 强大的逻辑推理是大语言模型“智能涌…

深度学习——LLM大模型分词

1. 前言 自从chatgpt出现&#xff0c;大模型的发展就进入了快车道&#xff0c;各种各样的大模型卷上天&#xff0c;作为一个在大模型时代的科研人&#xff0c;即使你不向前&#xff0c;也会被时代裹挟着向前&#xff0c;所以还是自己走快一点比较好&#xff0c;免得被后浪拍死…

呆错图床系统,一款开源免费的图床系统

源码介绍 呆错图床系统是一款免费的PHP图床程序&#xff0c;核心功能是提供图片外链服务、图床API服务、图片CDN加速与破解防盗链。 下载地址&#xff1a; https://download.csdn.net/download/huayula/89693127

基于七牛云上传,下载文件

准备工作 1.创建一个七牛云账号 2.登录账号&#xff0c;进入个人中心&#xff0c;创建一组密钥&#xff08;ak和sk&#xff09; 3. 创建一个公有的存储空间&#xff08;桶&#xff09; 注&#xff1a;存储地区的选择基于你的用户的分布主要在哪里。 七牛云直接白送10GB给我们…

给鼠标一个好看的指针特效 鼠标光标如何修改形状?

许多爱美的小伙伴们都想着如何给自己的电脑打扮一下&#xff0c;用各种各样的途径来美化我们的电脑。今天我们给大家分享一下&#xff0c;如何美化鼠标效果&#xff0c;给鼠标指针修改成一个非常好看的形状~ 一起来看几组鼠标的效果&#xff0c;小编我给大家做了个录屏&#x…

LuaJit分析(十一)去除string.dump函数

Lua脚本中的string.dump函数用于生成字节码文件&#xff0c;根据对 luajit -b命令的分析可以得出&#xff0c;最终dump出字节码文件都是使用的string.dump函数。 因此即使我们的指令顺序被打乱&#xff0c;通过loadfile系统调用&#xff0c;再通过string.dump调用&#xff0c;…

缓存解决方案。Redis 和 Amazon ElastiCache 比较

欢迎来到雲闪世界。Redis 和 Amazon ElastiCache 等缓存解决方案是通过将频繁访问的数据存储在内存中来提高应用程序性能的热门选择。让我们从实施简单性、性能、成本和维护方面对它们进行比较。 实施简单 设置 Redis 需要在基础设施或云实例上安装和配置 Redis 服务器。它可…

回归预测|基于CNN-LSTM-Attention结合Adaboost集成数据预测Matlab程序 多特征输入单输出

回归预测|基于CNN-LSTM-Attention结合Adaboost集成数据预测Matlab程序 多特征输入单输出 文章目录 前言回归预测|基于CNN-LSTM-Attention结合Adaboost集成数据预测Matlab程序 多特征输入单输出 一、CNN-LSTM-Attention-Adaboost模型**详细流程&#xff1a;****基本原理&#xf…

Golang | Leetcode Golang题解之第381题O(1)时间插入、删除和获取随机元素-允许重复

题目&#xff1a; 题解&#xff1a; type RandomizedCollection struct {idx map[int]map[int]struct{}nums []int }/** Initialize your data structure here. */ func Constructor() RandomizedCollection {return RandomizedCollection{idx: map[int]map[int]struct{}{},}…

服务器数据恢复—LeftHand存储中raid5阵列多块磁盘离线的数据恢复案例

LeftHand存储支持RAID5、RAID6、RAID10磁盘阵列&#xff0c;同时还支持卷快照&#xff0c;卷动态扩容等。下面简单聊一下LeftHand存储的结构和一个LeftHand p4500存储中磁盘阵列数据恢复案例。 服务端&#xff1a; 客户端&#xff1a; LeftHand存储结构&#xff1a; Lefthand存…

打架目标检测数据集 9000张 打架数据集 带标注voc yolo

本项目的目标是开发一个能够自动检测公共场所中打架行为的系统。该系统利用先进的计算机视觉技术和深度学习方法&#xff0c;在实时视频流或静态图像中准确地识别出打架行为&#xff0c;这对于维护公共安全至关重要。 技术栈 YOLOv8: 作为主要的目标检测框架&#xff0c;因其在…

基于my Batis优化图书管理系统(二)

4. 图书列表 添加图书之后, 跳转到图书列表⻚⾯, 并没有显⽰刚才添加的图书信息, 接下来我们来实现图 书列表 4.1 需求分析 当查询到我们的图书数据很多的时候&#xff0c;一个页可能存放不了&#xff0c;所以我们进行分页处理数据&#xff0c;并且分页进行查询&#xff1b;如…