深入Android系统基础知识及基本概念

news2025/1/15 7:00:07

深入Android系统基础知识及基本概念

Android应用程序的基本组成部分,包括Activities(活动)、Services(服务)、Broadcast receivers(广播接收器)和Content providers(内容提供者)。在深入讨论这些组件和Android操作系统之前,作者提出了先了解一下Android用户的操作行为。

Android手机上的应用程序列表以及与应用程序相关的基本操作。用户可以点击应用程序图标来打开应用程序,还可以使用导航栏中的图标在"返回"、"主屏幕"和"最近使用的应用程序"之间进行导航。

Android操作系统的技术方面

Android操作系统实际上是Linux的定制版本。与Linux中创建不同用户一样,每个应用程序实际上都是一个用户。每个应用程序都有自己的私有区域,可以通过权限进行访问。每个已安装的应用程序都有一个UID(用户ID)和GID(组ID):

  • UID:控制应用程序对文件、文件夹、资源等的访问。
  • GID:允许将特定一组用户分组在一起,组内的用户可以在权限内访问共享文件。

接下来,文章介绍了四个基本组件的作用:

  1. Activity(活动):Android应用程序的基本构建块,占据其所占用的所有空间,可以堆叠在彼此上面。

  2. Services(服务):后台进程,当需要另一个服务时会激活服务。服务可以提供给应用程序外部的组件使用,因此可以使该应用程序的一些基本功能对其他应用程序可用。

  3. Broadcast Receivers(广播接收器):类似于中断处理程序,当发生重要事件时触发以在应用程序中进行处理。在不处理特定事件时处于非活动状态。

  4. Content Providers(内容提供者):在想要从另一个应用程序中访问数据时使用。它可以检索文件或其他存储组件,通常依赖于SQLite。

最后,AndroidManifest.xml中定义应用程序中静态使用的基本组件,并解释了Android操作系统在启动应用程序时会检查清单,并根据需要打开必要的应用程序。当用户打开Android手机时,系统会显示一个包含应用程序图标的Activity,并且可以通过各种基本组件(如点击应用程序图标、通知等)访问应用程序。应用程序有与组件数量相同的入口点。

上图给出当用户点击应用程序图标时,Android系统的响应过程, 用户点击应用程序图标后,系统会调用启动器中的onClick()方法来响应。然后,Activity Manager调用startActivity()方法。在Android操作系统下,Activity Manager调用startViaZygote()方法。接着,Zygote(子进程孵化器)会分叉(fork)该应用程序以启动它,并将其传递给系统。

Activity Manager

  1. Activity Manager负责管理基本组件。在应用程序开发中,如果出现ANR(应用程序无响应)错误,通常是由Activity Manager引起的。此外,Activity Manager还处理Activity的生命周期、OOM(内存耗尽)和低内存情况。

  2. 当用户点击应用程序时,该应用程序可能已存在于后台栈中,也可能是首次启动。首次启动的应用程序会开始管理更多系统资源。

  3. 硬件有一定的容量,这个过程不能无限进行。系统需要在启动新组件/应用程序时终止或释放旧的应用程序或低优先级应用程序。为了防止用户检测到这些进程的终止,Android为组件提供了生命周期。系统通过生命周期回调(LifeCycle CallBacks)来管理这些组件的状态。

综上所述,这段内容描述了Android系统中用户点击应用程序图标后的操作流程,以及Activity Manager在处理应用程序和组件时的关键角色。

Android 内存管理

Android中的内存管理,包括Out Of Memory(OOM)和Low Memory两种结构。

  1. OOM内存管理: OOM实际上与Linux中的OOM相同。它创建了一个从-17到+15的评分系统来清理内存。评分越高,被OOM终止的可能性越大。评分是根据CPU时间、运行时间、内存大小等参数计算的。OOM在内存开始填满时开始起作用。

  2. Low Memory内存管理: Android开发人员希望更好地控制内存,因此他们创建了Low Memory结构。在Low Memory中,系统会在达到一定的阈值时触发。系统会保存正在运行的后台进程。随着阈值的增加,OOM会终止非关键的后台进程以及在这些阈值下保存的前台应用程序。

综上所述,这段内容说明了Android内存管理的两种结构:OOM和Low Memory。OOM根据评分系统终止进程,而Low Memory在达到阈值时触发,并保存正在运行的后台进程,以便更好地控制内存。

Zygote

Zygote是Android中的一个专用结构,它的功能和工作原理:

  1. Zygote是专门用于启动应用程序的结构:Zygote将所有应用程序共享的组件集中在一起,以统一它们并缩短它们的启动过程。它仅在需要启动新应用程序时处于活动状态,并准备了应用程序在运行时可能需要的资源。

  2. Zygote创建系统中的一个套接字:当它接收到一个应用程序启动请求时,Zygote会监听并分叉(fork)操作。分叉的好处在于应用程序可能需要的所有资源都可用且预加载。分叉操作实际上使用它们自己的副本,因此不管应用程序数量如何,资源的单个副本都保留在RAM中。

  3. Zygote首先启动的是System Server:它作为一个独立的进程运行。

此外,文章提到了Jetpack Compose是一个特殊情况。由于Jetpack Compose是一个独立的库,无法从Zygote中受益。因此,它从1.0版本开始使用Profile Installers。

Intent

Android中的Intent(意图)的作用和重要性:

  1. Intent允许组件/应用程序进行交互:Intent是一个被动对象,它的效果可能因其内容、使用的机制和已安装的应用程序而异。如果应用程序本身无法满足用户的请求,它可以通过与其他应用程序进行交互来提供满足用户需求的功能。例如,在相机-相册操作中,可以通过与系统提供的应用程序进行交互来执行操作。

  2. 系统提供的导航栏也使用Intent:系统提供的导航栏实际上也调用Intent来实现返回、主屏幕、最近使用的应用程序等功能。例如,主屏幕按钮使用Intent.CATEGORY_HOME来实现主屏幕的功能。

综上所述,Intent是Android中用于组件和应用程序之间交互的重要机制,它允许应用程序通过与其他应用程序互动来满足用户需求,并被系统导航栏等组件使用来触发不同的操作。

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

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

相关文章

Mysql---第八篇

系列文章目录 文章目录 系列文章目录一、mysql执行计划怎么看一、mysql执行计划怎么看 执行计划就是sql的执行查询的顺序,以及如何使用索引查询,返回的结果集的行数 EXPLAIN SELECT * from A where X=? and Y=? 1。id :是一个有顺序的编号,是查询的顺序号,有几个 sel…

ModbusTCP服务端

1在Device下,添加设备net: 公交车。 2在net下添加 ModbusTCP

技术人员如何提升商业敏感度?

在商业领域,最基本也是最实用的财务知识,就是看懂三张报表。简单地说,现金流量表,决定企业能不能活下来;资产负债表和利润表,决定企业活得好不好。下面分别来学习这三张报表。 资产负债表 资产负债表&#…

浅谈一下前端字符编码

背景 众所周知,计算机只能识别二进制,它是由逻辑电路组成,逻辑电路通常只有两个状态,开关的接通与断开,这两种状态正好可以用二进制数的0和1表示。但是现实中存在着其他的字符:数字、字母、中文、特殊符号…

如何实现Web应用、网站状态的监控?

如何实现Web应用、网站状态的监控? 关键词:网站监控,服务器监控,页面性能监控,用户体验监控本文通过代码分析、网站应用介绍网站状态监控的方式下文主要分为网站应用、技术实现两部分 一、网站应用 现在网络上已经存在一些Web网站监控的服务&#xff…

Vue ——08、路由嵌套,参数传递及重定向

路由嵌套,参数传递及重定向 一、路由嵌套二、参数传递第一种方式:第二种方式: 三、重定向————————创作不易,如觉不错,随手点赞,关注,收藏(* ̄︶ ̄),谢…

【C++杂货铺】继承由浅入深详细总结

文章目录 一、继承的概念及定义1.1 继承的概念1.2 继承定义1.2.1 定义格式1.2.2 继承方式和访问限定符1.2.3 继承基类成员访问方式的变化 二、基类和派生类对象赋值转换三、继承中的作用域四、派生类中的默认成员函数4.1 默认构造函数4.2 拷贝构造函数4.3 赋值运算符重载函数4.…

03使用Spring基于XML的方式注册第一个组件

基于XML的方式注册第一个组件 开发步骤 第一步: 创建Maven工程配置生成的pom.xml文件, 添加spring context基础依赖和junit依赖(注意根据Spring官方文档描述,Spring6需要JDK版本17) 当添加Spring的基础依赖spring context之后,Maven会自动关联并引入其他依赖spring aop, spr…

前端生态系统:构建现代Web应用的完整指南

💂 个人网站:【工具大全】【游戏大全】【神级源码资源网】🤟 前端学习课程:👉【28个案例趣学前端】【400个JS面试题】💅 寻找学习交流、摸鱼划水的小伙伴,请点击【摸鱼学习交流群】 前端开发生态系统是一个…

Selenium常见问题解析

1、元素定位失败: 在使用Selenium自动化测试时,最常见的问题之一是无法正确地定位元素,这可能导致后续操作失败。解决方法包括使用不同的定位方式(如xpath、CSS selector、id等),等待页面加载完全后再进行…

[NLP] LLM---<训练中文LLama2(二)>扩充LLama2词表构建中文tokenization

使用SentencePiece的除了从0开始训练大模型的土豪和大公司外,大部分应该都是使用其为当前开源的大模型扩充词表,比如为LLama扩充通用中文词表(通用中文词表,或者 垂直领域词表)。 LLaMA 原生tokenizer词表中仅包含少量…

asp.net+sqlserver医院体检信息管理系统

一、源码描述 这是一款简洁十分美观的ASP.NETsqlserver源码,界面十分美观,功能也比较全面,比较适合 作为毕业设计、课程设计、使用,感兴趣的朋友可以下载看看哦 二、功能介绍 该源码功能十分的全面,具体介绍如下&…

PyTorch深度学习实战——基于ResNet模型实现猫狗分类

PyTorch深度学习实战——基于ResNet模型实现猫狗分类 0. 前言1. ResNet 架构2. 基于预训练 ResNet 模型实现猫狗分类相关链接 0. 前言 从 VGG11 到 VGG19,不同之处仅在于网络层数,一般来说,神经网络越深,它的准确率就越高。但并非…

Linux学习第12天:基于API函数的字符设备驱动开发:一字一符总见情

本节学习的内容主要为基于LinuxAPI函数的字符设备驱动的开发,还包括在驱动模块加载的时候如何自动创建设备节点。总结的脑图如下: 一、驱动原理 1.分配和释放设备号 申请设备号函数: int alloc_chrdev_region(dev_t *dev, unsigned basemin…

改进YOLOv5小目标检测:构建多尺度骨干和特征增强模块,提升小目标检测

构建多尺度骨干和特征增强模块,提升小目标检测 背景代码使用配置文件如下🔥🔥🔥 提升小目标检测,创新提升 🔥🔥🔥 测试在小目标数据集进行提点 👉👉👉: 新设计的创新想法,包含详细的代码和说明,具备有效的创新组合 🐤🐤🐤 1. 本文包含两个创新改…

SQL优化--count优化

select count(*) from tb_user ;在之前的测试中,我们发现,如果数据量很大,在执行count操作时,是非常耗时的。 MyISAM 引擎把一个表的总行数存在了磁盘上,因此执行 count(*) 的时候会直接返回这个 数,效率很…

档案管理系统设计与实现

摘 要 近年来,随着企业彼此间的竞争日趋激烈,信息技术在企业的发展中占据着越来越重要的地位。在企业的运输生产中,档案已成为企业运输经营中不可或缺的一部分,为管理者进行管理决策和进行各种经营活动提供了重要的依据&#xf…

前后端分离--Vue的入门基础版

目录 一.前后端分离 二.Vue的简介 三.Vue的入门案例 四.Vue的生命周期 一.前后端分离 前后端分离是一种软件架构模式,将应用程序的前端(用户界面)和后端(数据处理和业务逻辑)独立开发、独立部署。在前后端分离的架…

【数据结构】AVL树的删除(解析有点东西哦)

文章目录 前言一、普通二叉搜索树的删除1. 删除结点的左右结点都不为空2. 删除结点的左结点为空,右节点不为空3. 删除结点的右结点为空,左节点不为空4. 删除结点的左右结点都不为空 二、AVL树的删除1. 删除结点,整棵树的高度不变化1.1 parent…

RISV-V架构的寄存器介绍

1、RISC-V的通用寄存器 (1)在编写汇编代码时,使用寄存器的ABI名字,一般不直接使用寄存器的编号; (2)x0-x31是用来做整形运算的寄存器,f0-f31是用来做浮点数运算的寄存器;…