应用基础知识
每个 Android 应用都处于各自的安全沙盒中,并受以下 Android 安全功能的保护:
- Android 操作系统是一种多用户 Linux 系统,其中的每个应用都是一个不同的用户;
- 默认情况下,系统会为每个应用分配一个唯一的 Linux 用户 ID(该 ID 仅由系统使用,应用并不知晓)。系统会为应用中的所有文件设置权限,使得只有分配给该应用的用户 ID 才能访问这些文件;
- 每个进程都拥有自己的虚拟机 (VM),因此应用代码独立于其他应用而运行。
- 默认情况下,每个应用都在其自己的 Linux 进程内运行。Android 系统会在需要执行任何应用组件时启动该进程,然后当不再需要该进程或系统必须为其他应用恢复内存时,其便会关闭该进程。
应用组件
Activity
Activity 是与用户交互的入口点,它表示拥有界面的单个屏幕
每个 Activity 都独立于其他 Activity 而存在,在权限允许的情况下,其他应用可以启动其中任何一个 Activity
Activity主要的交互有
- 追踪用户当前关心的内容(屏幕上显示的内容),以确保系统继续运行托管 Activity 的进程。
- 了解先前使用的进程包含用户可能返回的内容(已停止的 Activity),从而更优先保留这些进程。
- 帮助应用处理终止其进程的情况,以便用户可以返回已恢复其先前状态的 Activity。
- 提供一种途径,让应用实现彼此之间的用户流,并让系统协调这些用户流。(此处最经典的示例是共享。)
个人理解
Activity构成了Android应用的用户界面,与Unity的客户端类似,但借助Android的机制,能够在不同的Activity,不同的应用之间进行交互
Service
服务是一个通用入口点,用于因各种原因使应用在后台保持运行状态。它是一种在后台运行的组件,用于执行长时间运行的操作或为远程进程执行作业。服务不提供界面。诸如 Activity 等其他组件可以启动服务,使该服务运行或绑定到该服务,以便与其进行交互。绑定服务之所以能运行,原因是某些其他应用(或系统)已表示希望使用该服务。从根本上讲,这是为另一个进程提供 API 的服务。因此,系统会知晓这些进程之间存在依赖关系,所以如果进程 A 绑定到进程 B 中的服务,系统便知道自己需使进程 B(及其服务)为进程 A 保持运行状态。此外,如果进程 A 是用户关心的内容,系统随即也知道将进程 B 视为用户关心的内容。由于存在灵活性(无论好坏),服务已成为非常有用的构建块,并且可实现各种高级系统概念。动态壁纸、通知侦听器、屏幕保护程序、输入方法、无障碍功能服务以及众多其他核心系统功能均可构建为在其运行时由应用实现、系统绑定的服务
BroadCastReceiver
借助广播接收器组件,系统能够在常规用户流之外向应用传递事件,从而允许应用响应系统范围内的广播通知。由于广播接收器是另一个明确定义的应用入口,因此系统甚至可以向当前未运行的应用传递广播。例如,应用可通过调度提醒来发布通知,以告知用户即将发生的事件。而且,通过将该提醒传递给应用的广播接收器,应用在提醒响起之前即无需继续运行。许多广播均由系统发起,例如,通知屏幕已关闭、电池电量不足或已拍摄照片的广播。应用也可发起广播,例如,通知其他应用某些数据已下载至设备,并且可供其使用。尽管广播接收器不会显示界面,但其可以创建状态栏通知在发生广播事件时提醒用户。但广播接收器更常见的用途只是作为通向其他组件的通道,旨在执行极少量的工作。
个人理解
通过应用的BroadCastReceiver,使应用能够接受来自其他应用或者系统的消息,并且能够在状态栏等地方展示。它多用于通知与提醒方面。
ContentProvider
内容提供程序管理一组共享的应用数据,您可以将这些数据存储在文件系统、SQLite 数据库、网络中或者您的应用可访问的任何其他持久化存储位置。其他应用可通过内容提供程序查询或修改数据(如果内容提供程序允许)。我们很容易将内容提供程序看作数据库上的抽象,因为其内置的大量 API 和支持时常适用于这一情况。但从系统设计的角度看,二者的核心目的不同。对系统而言,内容提供程序是应用的入口点,用于发布由 URI 架构识别的已命名数据项。因此,应用可以决定如何将其包含的数据映射到 URI 命名空间,进而将这些 URI 分发给其他实体
个人理解
应用的存储组件,负责管理共享的应用数据。在ContentProvider允许的情况下,能够让其他应用查询与修改数据。ContentProvider也适用于私有数据
启动组件
在四种组件类型中,有三种(Activity、服务和广播接收器)均通过异步消息 Intent 进行启动。Intent 会在运行时对各个组件进行互相绑定。可以将 Intent 视为从其他组件请求操作的信使
使用Intent对象创建intent
对于Activity和Service,Intent 可能会传达对 Activity 的请求,可以通过启动 Activity 来接收结果,这样 Activity 还会返回 Intent中的结果
对于BroadCastReceiver,Intent 只会定义待广播的通知。例如,指示设备电池电量不足的广播只包含指示“电池电量不足”的已知操作字符串
对于ContentProvider,Content会在成为ContentResolver的目标时启动
AndroidManifast.xml
在 Android 系统启动应用组件之前,系统必须通过读取应用的清单文件 (AndroidManifest.xml) 确认组件存在,应用必须在此文件中声明其所有组件,该文件必须位于应用项目目录的根目录中
除了声明应用的组件外,清单文件还有许多其他作用,如:
- 确定应用需要的任何用户权限,如互联网访问权限或对用户联系人的读取权限
- 声明应用使用或需要的硬件和软件功能,如相机、蓝牙服务或多点触摸屏幕
- 根据应用使用的 API,声明应用所需的最低API级别
- 声明应用需要链接的 API 库