深入Android系统基础知识及基本概念
Android应用程序的基本组成部分,包括Activities(活动)、Services(服务)、Broadcast receivers(广播接收器)和Content providers(内容提供者)。在深入讨论这些组件和Android操作系统之前,作者提出了先了解一下Android用户的操作行为。
Android手机上的应用程序列表以及与应用程序相关的基本操作。用户可以点击应用程序图标来打开应用程序,还可以使用导航栏中的图标在"返回"、"主屏幕"和"最近使用的应用程序"之间进行导航。
Android操作系统的技术方面
Android操作系统实际上是Linux的定制版本。与Linux中创建不同用户一样,每个应用程序实际上都是一个用户。每个应用程序都有自己的私有区域,可以通过权限进行访问。每个已安装的应用程序都有一个UID(用户ID)和GID(组ID):
UID
:控制应用程序对文件、文件夹、资源等的访问。GID
:允许将特定一组用户分组在一起,组内的用户可以在权限内访问共享文件。
接下来,文章介绍了四个基本组件的作用:
-
Activity(活动):Android应用程序的基本构建块,占据其所占用的所有空间,可以堆叠在彼此上面。
-
Services(服务):后台进程,当需要另一个服务时会激活服务。服务可以提供给应用程序外部的组件使用,因此可以使该应用程序的一些基本功能对其他应用程序可用。
-
Broadcast Receivers(广播接收器):类似于中断处理程序,当发生重要事件时触发以在应用程序中进行处理。在不处理特定事件时处于非活动状态。
-
Content Providers(内容提供者):在想要从另一个应用程序中访问数据时使用。它可以检索文件或其他存储组件,通常依赖于SQLite。
最后,AndroidManifest.xml中定义应用程序中静态使用的基本组件,并解释了Android操作系统在启动应用程序时会检查清单,并根据需要打开必要的应用程序。当用户打开Android手机时,系统会显示一个包含应用程序图标的Activity,并且可以通过各种基本组件(如点击应用程序图标、通知等)访问应用程序。应用程序有与组件数量相同的入口点。
上图给出当用户点击应用程序图标时,Android系统的响应过程, 用户点击应用程序图标后,系统会调用启动器中的onClick()
方法来响应。然后,Activity Manager调用startActivity()
方法。在Android操作系统下,Activity Manager调用startViaZygote()
方法。接着,Zygote(子进程孵化器)会分叉(fork)该应用程序以启动它,并将其传递给系统。
Activity Manager
-
Activity Manager负责管理基本组件。在应用程序开发中,如果出现ANR(应用程序无响应)错误,通常是由Activity Manager引起的。此外,Activity Manager还处理Activity的生命周期、OOM(内存耗尽)和低内存情况。
-
当用户点击应用程序时,该应用程序可能已存在于后台栈中,也可能是首次启动。首次启动的应用程序会开始管理更多系统资源。
-
硬件有一定的容量,这个过程不能无限进行。系统需要在启动新组件/应用程序时终止或释放旧的应用程序或低优先级应用程序。为了防止用户检测到这些进程的终止,Android为组件提供了生命周期。系统通过生命周期回调(
LifeCycle CallBacks
)来管理这些组件的状态。
综上所述,这段内容描述了Android系统中用户点击应用程序图标后的操作流程,以及Activity Manager在处理应用程序和组件时的关键角色。
Android 内存管理
Android中的内存管理,包括Out Of Memory(OOM)和Low Memory两种结构。
-
OOM内存管理: OOM实际上与Linux中的OOM相同。它创建了一个从-17到+15的评分系统来清理内存。评分越高,被OOM终止的可能性越大。评分是根据CPU时间、运行时间、内存大小等参数计算的。OOM在内存开始填满时开始起作用。
-
Low Memory内存管理: Android开发人员希望更好地控制内存,因此他们创建了Low Memory结构。在Low Memory中,系统会在达到一定的阈值时触发。系统会保存正在运行的后台进程。随着阈值的增加,OOM会终止非关键的后台进程以及在这些阈值下保存的前台应用程序。
综上所述,这段内容说明了Android内存管理的两种结构:OOM和Low Memory。OOM根据评分系统终止进程,而Low Memory在达到阈值时触发,并保存正在运行的后台进程,以便更好地控制内存。
Zygote
Zygote是Android中的一个专用结构,它的功能和工作原理:
-
Zygote是专门用于启动应用程序的结构:Zygote将所有应用程序共享的组件集中在一起,以统一它们并缩短它们的启动过程。它仅在需要启动新应用程序时处于活动状态,并准备了应用程序在运行时可能需要的资源。
-
Zygote创建系统中的一个套接字:当它接收到一个应用程序启动请求时,Zygote会监听并分叉(fork)操作。分叉的好处在于应用程序可能需要的所有资源都可用且预加载。分叉操作实际上使用它们自己的副本,因此不管应用程序数量如何,资源的单个副本都保留在RAM中。
-
Zygote首先启动的是System Server:它作为一个独立的进程运行。
此外,文章提到了Jetpack Compose是一个特殊情况。由于Jetpack Compose是一个独立的库,无法从Zygote中受益。因此,它从1.0版本开始使用Profile Installers。
Intent
Android中的Intent(意图)的作用和重要性:
-
Intent允许组件/应用程序进行交互:Intent是一个被动对象,它的效果可能因其内容、使用的机制和已安装的应用程序而异。如果应用程序本身无法满足用户的请求,它可以通过与其他应用程序进行交互来提供满足用户需求的功能。例如,在相机-相册操作中,可以通过与系统提供的应用程序进行交互来执行操作。
-
系统提供的导航栏也使用Intent:系统提供的导航栏实际上也调用Intent来实现返回、主屏幕、最近使用的应用程序等功能。例如,主屏幕按钮使用Intent.CATEGORY_HOME来实现主屏幕的功能。
综上所述,Intent是Android中用于组件和应用程序之间交互的重要机制,它允许应用程序通过与其他应用程序互动来满足用户需求,并被系统导航栏等组件使用来触发不同的操作。