应用清单
每个应用的根目录中都必须包含一个 AndroidManifest.xml 文件(且文件名精确无误)。 清单文件向 Android 系统提供应用的必要信息,系统必须具有这些信息方可运行应用的任何代码。
此外,清单文件还可执行以下操作:
- 为应用的 Java 软件包命名。软件包名称充当应用的唯一标识符。
- 描述应用的各个组件,包括构成应用的 Activity、服务、广播接收器和内容提供程序。它还为实现每个组件的类命名并发布其功能,例如它们可以处理的 Intent消息。这些声明向 Android 系统告知有关组件以及可以启动这些组件的条件的信息。
- 确定托管应用组件的进程。
- 声明应用必须具备哪些权限才能访问 API 中受保护的部分并与其他应用交互。还声明其他应用与该应用组件交互所需具备的权限
- 列出 Instrumentation类,这些类可在应用运行时提供分析和其他信息。这些声明只会在应用处于开发阶段时出现在清单中,在应用发布之前将移除
- 声明应用所需的最低 Android API 级别
- 列出应用必须链接到的库
清单文件结构
下面的代码段显示了清单文件的通用结构及其可包含的每个元素。每个元素及其所有属性全部记录在一个单独的文件中。
下面是清单文件的示例:
. . .
. . .
. . .
以下列表包含可出现在清单文件中的所有元素,按字母顺序列出:
注:这些是仅有的合法元素 – 您无法添加自己的元素或属性。
文件约定
本节描述普遍适用于清单文件中所有元素和属性的约定和规则。
元素
只有
如果一个元素包含某些内容,也就包含其他元素。所有值均通过属性进行设置,而不是通过元素内的字符数据设置。
同一级别的元素通常不分先后顺序。例如,
-
元素必须跟在别名所指的 之后。 -
元素必须是 结束标记后。元素内最后一个元素。换言之, 结束标记必须紧接在
属性
从某种意义上说,所有属性都是可选的。但是,必须指定某些属性,元素才可实现其目的。请使用本文档作为参考。对于真正可选的属性,它将指定默认值或声明缺乏规范时将执行何种操作。
除了根 android:
前缀开头。例如,android:alwaysRetainTaskState
。由于该前缀是通用的,因此在按名称引用属性时,本文档通常会将其忽略。
声明类名
许多元素对应于 Java 对象,包括应用本身的元素(
如果按照您针对组件类(Activity、Service 和 BroadcastReceiver ContentProvider)几乎一直采用的方式来定义子类,则该子类需通过 name
属性来声明。该名称必须包含完整的软件包名称。例如,Service 子类可能会声明如下:
. . .
. . .
但是,如果字符串的第一个字符是句点,则应用的软件包名称(如
. . .
. . .
当启动组件时,Android 系统会创建已命名子类的实例。如果未指定子类,则会创建基类的实例。
多个值
如果可以指定多个值,则几乎总是在重复此元素,而不是列出单个元素内的多个值。例如,intent 过滤器可以列出多个操作:
. . .
资源值
某些属性的值可以显示给用户,例如,Activity 的标签和图标。这些属性的值应该本地化,并通过资源或主题进行设置。资源值用以下格式表示:
@[package:]type/name
如果资源与应用在同一个软件包中,可以省略软件包名称。类型是资源类型,例如字符串或可绘制对象,名称是标识特定资源的名称。下面是示例:
主题中的值用类似的方法表示,但是以 ? 开头,而不是以 @ 开头:
?[package:]type/name
字符串值
如果属性值为字符串,则必须使用双反斜杠 ( \ \ ) 转义字符,例如,使用 \ \n 表示换行符或使用 \ \uxxxx 表示 Unicode 字符。
文件功能
下文介绍在清单文件中体现某些 Android 特性的方式。
Intent 过滤器
应用的核心组件(例如其 Activity、服务和广播接收器)由 intent 激活。Intent 是一系列用于描述所需操作的信息(Intent 对象),其中包括要执行操作的数据、应执行操作的组件类别以及其他相关说明。Android 系统会查找合适的组件来响应 intent,根据需要启动组件的新实例,并将其传递到 Intent对象。
组件将通过 intent 过滤器公布它们可响应的 intent 类型。由于Android 系统在启动某组件之前必须了解该组件可以处理的 intent,因此 intent 过滤器在清单中被指定为
显式命名目标组件的 intent 将激活该组件,因此过滤器不起作用。不按名称指定目标的 intent 只有在能够通过组件的一个过滤器时才可激活该组件。
如需了解有关如何根据 intent 过滤器测试 Intent 对象的信息,请参阅 Intent 和 Intent 过滤器文档。
图标和标签
对于可以显示给用户的小图标和文本标签,大量元素具有 icon
和 label
属性。此外,对于同样可以显示在屏幕上的较长说明文本,某些元素还具有 description
属性。例如,
无论何种情况下,在包含元素中设置的图标和标签都将成为所有容器子元素的默认 icon
和 label
设置。因此,在
在实现过滤器公布的功能时,只要向用户呈现组件,系统便会使用为 intent 过滤器设置的图标和标签表示该组件。例如,具有 android.intent.action.MAIN 和 android.intent.category.LAUNCHER 设置的过滤器将 Activity 公布为可启动应用的功能,即,公布为应显示在应用启动器中的功能。在过滤器中设置的图标和标签显示在启动器中。
权限
权限是一种限制,用于限制对部分代码或设备上数据的访问。施加限制是为了保护可能被误用以致破坏或损害用户体验的关键数据和代码。
每种权限均由一个唯一的标签标识。标签通常指示受限制的操作。以下是 Android 定义的一些权限:
- android.permission.CALL_EMERGENCY_NUMBERS
- android.permission.READ_OWNER_DATA
- android.permission.SET_WALLPAPER
- android.permission.DEVICE_POWER
一个功能只能由一种权限保护。
如果应用需要访问受权限保护的功能,则必须在清单中使用
应用也可以使用权限保护自己的组件。它可以采用由 Android 定义(如 android.Manifest.permission 中所列)或由其他应用声明的任何权限。它也可以定义自己的权限。新权限用
. . .
. . .
请注意,在此示例中,DEBIT_ACCT
权限不仅是通过
同样还是在此示例中,如果将 permission
属性设置为在其他位置(例如,android.permission.CALL_EMERGENCY_NUMBERS
)声明的权限,则无需使用
库
每个应用均链接到默认的 Android 库,该库中包括用于开发应用(以及通用类,如 Activity、服务、intent、视图、按钮、应用、ContentProvider)的基本软件包。
但是,某些软件包驻留在自己的库中。如果应用使用来自其中任一软件包的代码,则必须明确要求其链接到这些软件包。清单必须包含单独的