文件功能
以下章节介绍清单文件是如何反映Android的某些功能的。
Intent过滤器
应用程序的核心组件(Activity、Service、Broadcast Receiver)都是通过Intent对象来激活的。Intent对象绑定了所期望的操作的信息说明——包括要操作的数据、执行操作的组件类别、以及其他相关的指令。Android会定位一个合适的组件来响应Intent对象的请求,如果需要它将启动这个组件的一个新的实例,并且把Intent对象传递给这个实例。
组件通过Intent过滤器来公布它们所具有的能力——组件所能响应的Intent对象的类型。因此Android系统在启动组件之前,必须了解组件能够处理那些Intent对象,Intent过滤器要在清单文件的<intent-filter>元素中指定。
明确命名目标组件的Intent对象,会激活那个组件,过滤器并不扮演一个角色,但是如果没有指定目标组件名称的Intent对象要想激活一个组件,那么它必须能够通过这个组件的一个过滤器来传递。
图标和标题
许多元素有icon和label属性,这两个属性分别是能够声明并显示给用户的小图标和文本标签。还有一些属性有description属性,这个属性值用于在屏幕上显示一些比较长的解释性的文本。例如<permission>元素就有这三个属性,这样在用户询问是否授予应用程序所请求权限时,就可以用一个icon代表权限、label代表权限名称、description来详细说明权限的内容,并把这些信息展示给用户。
在任何情况下,在容器型元素中设置的icon和label都会成为它所包含的所有子元素的默认的icon和label设置。这样,在<application>元素中设置的icon和label属性值就会成为每个应用程序组件的默认icon和label值。针对一个组件的icon和label设置也会有同样的效果---例如,一个<activity>元素中设置的icon和label属性值,会成这个<activity>中每个<intent-filter>元素的默认设置。如果<application>元素设置了一个label属性,但是<activity>元素以及它的<intent-filter>都没有设置这个属性,那么这个<application>元素的label属性值会作为<activity>和<intent-filter>元素的label属性的默认值。
给Intent过滤器设置的icon和label属性被用于代表一个组件,不管什么时候,过滤器都会用这两个属性来向用户展示组件所能满足的功能。例如,带有android.intent.action.MAIN和android.intent.category.LAUNCHER操作的一个过滤器,会把对应的Activity做应用程序的启动界面来处理,也就是说,它应该作为Android应用程序启动器中一个应用程序来显示,因此这个过滤器中的icon和label的属性设置应该显示在Launcher中。
权限
permission是一种约束,它限制了对设备上的数据或部分代码的访问。施加权限是为了保护关键的数据和代码不被滥用,防止给用户带来不好的用户体验。
每种权限都会有一个唯一的标签来标识。通常,标签指明了要约束的操作。例如:
android.permission.CALL_EMERGENCY_NUMBERS
android.permission.READ_OWNER_DATA
android.permission.SET_WALLPAPER
android.permission.DEVICE_POWER
一个功能能够通过多个权限来施加保护。
如果应用程序需要访问一个被权限保护的功能,那么它必须在清单文件中用<uses-permission>元素来声明其要求的权限。然后,在应用程序被安装到设备上时,Android安装器会通过检查应用程序的数字证书,以及询问用户,来确定是否要授予应用程序所请求的权限。如果权限请求被接受,那么应用程序就能够使用被保护的功能,否则,在试图访问那些受保护的功能时就会失败,而且不会给用户任何提示。
应用程序也可以有保护它自己的组件(Activity、Service、Broadcast Receiver、Content Provider)。通常可以利用Android系统中定义的权限(在android.Manifest.permission类中列出的权限),也可以利用其它应用程序声明的权限,还可以定义自己的权限。用<permission>元素来声明一个新的权限。例如,一个Activity可以通过下列方法来保护:
<manifest . . . >
<permissionandroid:name="com.example.project.DEBIT_ACCT" . . . />
<uses-permissionandroid:name="com.example.project.DEBIT_ACCT"/>
. . .
<application . . .>
<activityandroid:name="com.example.project.FreneticActivity"
android:permission="com.example.project.DEBIT_ACCT"
. . . >
. . .
</activity>
</application>
</manifest>
要注意的是,在这个例子中,不仅使用<permission>元素声明了一个DEBIT_ACCT权限,而且还用<uses-permission>元素申请了一个DEBIT_ACCT权限。为了让应用程序的其他组件能够启动这个被保护的Activity,即使这种保护是应用程序自己施加的,也必须要这样申请。
在同一个例子中,如果permission属性设置了另外一种权限(如android:permission.CALL_EMERGENCY_NUMBERS),那么就没有必要再用<permission>元素来声明它了。但是依然有必要使用<uses-permission>元素来进行必要的申请。
<permission-tree>元素为一组在代码中定义的权限声明了一个命名空间,并且<permission-group>元素为这个权限组定义了一个标签,这个标签在向用户展示权限时,只会影响到权限的分组。<permission-group>元素没有指定哪个权限属于该组,它只是给出了一个组名。一个权限通过比较<permission>元素的permissionGroup属性值来确定其分组。
外部类库
每个应用程序都会链接默认的Android类库,包括构建程序的基本程序包(如,Activity、Service、Intent、View、Button、Application、ContentProvider等等)。
但是,有些包会驻留在它们自己的类库中,如果应用要使用这些包中的代码,就必须明确的要求链接这些类库。对于每个要链接的类库,清单文件中必须包含单独的<uses-library>元素。