AndroidManifest.xml
AndroidManifest.xml文件
每个Android应用程序都必须有一个AndroidManifest.xml(名单)文件在根目录。这个名单呈现了该应用程序安装到系统所必需的信息,通知系统必须具备这些信息才能运行任何应用程序代码。名单做了一下事情:
- 它命名了这个应用程序的java包名。这个包名作为应用程序的唯一标识符。
- 它描述了应用程序的组件——Activities、Services、Broadcast、Receivers和Content provider。它指定实现各个组件并发布组件功能的类的类名(例如,它们可以助理哪些Intent消息)。这些声明让Android系统知道组件是哪些以及它们在什么情况下能启动。
- 它决定哪个进程将托管应用程序组件。
- 它声明了哪些权限应用程序必须拥有以访问API受保护的部分,以及与其他应用程序交互。
- 它还声明了其他应用程序必须拥有那些权限才能与应用程序组件交互。
- 它列出Instrumentation(测试设备)类,在应用程序运行时提供分析和其它信息。这些声明出现在名单里仅当应用程序被开发或测试时(发布时不应该出现)
- 它声明了应用程序需要的最低版本的Android API。
- 它列出了应用程序必须链接到的库文件
AndroidManifest.xml的结构
下图显示了名单文件的一般结构以及它所能包含的每个元素。每个元素连同它的属性被记录在一个单独的文件里面。
<?xml version="1.0" encoding="utf-8"?>
<manifest>
<uses-permission />
<permission />
<permission-tree />
<permission-group />
<instrumentation />
<uses-sdk />
<uses-configuration />
<uses-feature />
<supports-screens />
<compatible-screens />
<supports-gl-texture />
<application>
<activity>
<intent-filter>
<action />
<category />
<data />
</intent-filter>
<meta-data />
</activity>
<activity-alias>
<intent-filter> . . . </intent-filter>
<meta-data />
</activity-alias>
<service>
<intent-filter> . . . </intent-filter>
<meta-data/>
</service>
<receiver>
<intent-filter> . . . </intent-filter>
<meta-data />
</receiver>
<provider>
<grant-uri-permission />
<meta-data />
<path-permission />
</provider>
<uses-library />
</application>
</manifest>
下面按字母顺序列出了所有可以出现在AndroidManifest.xml里的元素:
<action>
<activity>
<activity-alias>
<application>
<category>
<data>
<grant-uri-permission>
<instrumentation>
<intent-filter>
<manifest>
<meta-data>
<permission>
<permission-group>
<permission-tree>
<provider>
<receiver>
<service>
<supports-screens>
<uses-configuration>
<uses-feature>
<uses-library>
<uses-permission>
<uses-sdk>
文件规则
一些约束和规则通常适用于名单里的所有元素和属性:
元素
只有<manifest>和<application>是必需的,这两个元素都是必需出现的,且只能出现一次,其它元素可以出现多次或者不出现,尽管至少它们中的一些必须出现以使名单有意义
如果一个元素不包含任何东西,它包含其它的元素。所有的值都通过属性来设置而不是作为元素内的字符数据。
处于同一等级的元素一般都不排序。例如,<activity> 和<provider> 和<service> 可以混合以任何顺序。但是<activity-alias>元素是个例外,它必须位于<activity>后面,因为它是这个Activity的别名。
属性
从正式意义上来说,所有属性都是可选的,但是,有一些属性必须指定,这个元素才能实现其目的。对于真正可选的属性,它提供了一个默认值或者状态以供缺省情况下选择
除某些根元素的属性外,所有的属性都以android为前缀。因为前缀是通用的,文档通常忽略它当通过名字指向属性时。
声明类名
许多元素就相当于java对象,包括应用程序本身的元素和它的主要组件
如果你定义了一个子类,作为你差不多总是使用的组件类,这个子类通过一个名字属性来声明。这个名字必须包含完整的包名。例如一个服务的子类必须声明如下:
<manifest . . . >
<application . . . >
<service android:name="com.example.project.SecretService" . . . >
. . .
</service>
. . .
</application>
</manifest>
然而,作为一个速记,如果字符串的第一个字符是句点,这个字符串被附加到应用程序的包名(在指定了<manifest>元素的包名属性的情况下),下面的作用和上面是相同的:
<manifest package="com.example.project" . . . >
<application . . . >
<service android:name=".SecretService" . . . >
. . .
</service>
. . .
</application>
</manifest>
当启动一个组件时,Android创建该指定的子类的一个实例,如果未指定子类,它将创建一个基类的实例
多重值
如果可以指定多个值,元素几乎总是重复使用,而不是在一个元素里列出多个值。例如一个<intent-filter>可以列出多个<ction>:
<intent-filter . . . >
<action android:name="android.intent.action.EDIT" />
<action android:name="android.intent.action.INSERT" />
<action android:name="android.intent.action.DELETE" />
. . .
</intent-filter>
资源值
一些属性的值是可以显示给用户的,例如Activity的标签和图标。这些属性的值应该被本地化,因而从一个资源或者主题设置。资源值被以如下形式显示,
@[package:]type:name
应用程序的名字可以被忽略如果资源位于应用程序相同的包里,type是资源的类型,例如string或者drawable,名字是特定资源的标识名,例如
<activity android:icon="@drawable/smallPic" . . . >
主题里的值也以类似的方式表示,但是词首使用?而不是@:
?[package:]type:name
字符串值
在属性值是字符串的地方,双斜杠必须使用转义字符,例如'\\n'作为换行,'\\uxxxx'作为一个Unicode字符
文件特性
下面的部分描述了一些Android功能如何体现在manifest文件中。
Intent Filters
应用程序的核心组件通过Intent激活。一个Intent是一个成捆的信息体,描述了一个期望的行为,包含行动所需的数据,执行这个行为的组件的category和其它相关的说明。Android寻找一个合适的组件去回应这个Intent,如果需要启动一个新的组件的实例并传递这个intent对象。
组件宣布自己的能力——它们所能回应的Intent类型——通过Intent Filter。因为Android系统在启动组件之前必须了解组件可以处理哪些Intent,Intent Filter被指定在manifest使用 <intent-filter> 元素,一个组件可以有任意数量的过滤器,每一个描述了一个不同的能力。
明确的指明一个目标组件的Intent将启动这个组件,过滤器将不能发挥作用。但没有通过名字指定目标的Intent可以激活一个组件只有当它通过组件过滤器的其中一个。
图标和标签
一些元素有icon 和label 属性,可以想用户显示一个小图标和文本标签,也有一个元素有description 属性,可以在屏幕上显示一个较长的解释性文字。例如<permission> 元素有这三个属性,因此当用户被询问是否授予权限给被请求的应用程序时,代表这个权限的图标,权限的名字,和需要承担的风险的描述都将呈现给用户。
在通常情况下,icon 和label 设置在一个封闭的元素里,成为该元素及其子元素的默认icon 和label 。因此,在 <application>元素设置的icon 和label 成为每个应用程序的组件的默认图标和标签。同样的,为一个组件设置icon 和label 使它们成为该组件及其Intent Filter的默认icon 和label 。如果 <application>元素设置一个label ,但是Activity和Intent Filter没有设置,那这个应用程序的标签被当作Activity和Intent Filter的 label 。
为一个Intent Filter设置icon和lable用于代表一个组件,每当这个组件被呈现给用户作为令人满意的功能被过滤器宣称。例如一个带有"android.intent.action.MAIN"和"android.intent.category.LAUNCHER"设置的过滤器宣称一个Activity作为一个启动应用程序的入口——也就是说,作为一个显示在应用程序里的启动入口。设置在过滤器中的icon和lable因而是一个显示的启动入口。
权限
权限是限制访问一部分代码或者设备上的数据的约束。限制是强加的以保护关键数据和代码不被滥用,歪曲,破坏用户体验。
每一个权限通过一个唯一的标签认定,通常这个标签表明了所限制的行为。
一个功能可以通过至少一个权限保护。
如果一个应用程序需要访问一个别权限保护的功能,它必须声明他需要这个权限通过在manifest里设置 <uses-permission>元素。然后当应用程序别安装到设别的时候,安装程序将决定是否授予被请求的权限通过检查官方签署的应用程序证书,在某些情况下还需要询问用户。如果权限被授予,该应用程序将可以试用被保护的功能,相反,它尝试访问这些功能会失败,并不会通知用户。
一个应用程序也可以保护它自己的组件通过权限,它可以使用Android定义的任何权限或者其它应用程序声明的权限,或者它可以定义它自己的权限。一个新的权限通过 <permission> 元素声明。例如,一个Activity可以通过如下方式保护:
<manifest . . . >
<permission android:name="com.example.project.DEBIT_ACCT" . . . />
<uses-permission android:name="com.example.project.DEBIT_ACCT" />
. . .
<application . . .>
<activity android:name="com.example.project.FreneticActivity"
android:permission="com.example.project.DEBIT_ACCT"
. . . >
. . .
</activity>
</application>
</manifest>
注意,在例子里,DEBIT_ACCT权限不只是声明在 <permission> 元素里,它的用途也被请求通过 <uses-permission> 元素。它的使用必须被请求,为了其它应用程序能启动被保护的Activity,甚至是施加保护的应用程序本身。
在同样的例子里,如果权限属性被设置到其它地方申明的权限,例如,android.permission.CALL_EMERGENCY_NUMBERS它将不再需要再次声明,使用<permission>元素。然而,它将依然需要请求它的使用通过<uses-permission>.。
<permission-tree> 元素为一组权限声明了一个命名空间,命名空间将被定义在代码里。 <permission-group>为一组权限定义了一个标签(使用<permission>声明在manifest里的和声明在其它地方的)。它影响的只是权限如何分组的当权限呈现给用户时。 <permission-group> 元素没有指定哪些权限属于这个组,它只是给这个组一个名字。权限通过在<permission> 元素里的 permissionGroup属性指定组的名字来放置到组里。
引用库
每个应用程序都链接到默认的Android库,它包含了构建应用程序的基本包
然而,有些包驻留在其它库里。如果需要使用这些包,它必须明确的要求链接到这些包。Manifest必须包含一个单独的 <uses-library>元素去指明哪些库。
浙公网安备 33010602011771号