文件约定
某些约定和规则普遍适用于清单中的所有元素和属性:
元素
只用<manifest>和<application>元素时必须的,而且这两个元素在文件中只能出现一次。其他元素则可以多次出现在清单中,或者根本就不出现—但是为了构建一个有意义的清单,必须要在清单中声明某些元素。
一个元素所包含的任何声明,包括它所包含的其他元素,所有的值都是通过属性来设置的,而不是用夹在开闭元素之间的字符数据。
相同级别的元素通常是没有顺序的。例如,<activity>、<provider>、<service>元素可以是任意顺序的。(<activity-alias>元素是个例外,它必须放在它所代表的<activity>元素的后面。)
属性
在正式的含义中,所有的属性都是可选的,但是,为了达成目的,必须要给元素指定一些属性。对于真正的可选属性,会指定发生在特殊情况下的默认值或状态。
除了<manifest>根元素的一些属性之外,其他所有属性的命名都带有android:前缀—例如,android:alwaysRetainTaskState。因为这个前缀是通用的,所以本文档在提到属性名时,通常会忽略这个前缀。
声明类名称
许多元素都对应着Java对象,包括代表应用程序自己的元素<application>,以及基本的组件—<activity>、<service>、<receiver>、<provider>等。
如果要定义子类,那么这些子类几乎总是继承以下组件类:Activity、Service、BroadcastReceiver、ContentProvider。子类是通过name属性来声明的。这个名称必须是完整Java包名。例如,下例演示了Service子类的声明方法:
<manifest . . . >
<application . . . >
<service android:name="com.example.project.SecretService" . . . >
. . .
</service>
. . .
</application>
</manifest>
但是,也可以使用简略的表达方式,用”.”符号做为name属性值的第一个字符。在Android系统解析是会在”.”符号前追加包名(包名是在<manifest>元素的package属性中声明的)。下例的声明方法与上例的结果相同:
<manifest package="com.example.project" . . . >
<application . . . >
<service android:name=".SecretService" . . . >
. . .
</service>
. . .
</application>
</manifest>
在启动组件时,Android会创建这个命名子类的一个实例对象。如果没有指定子类,那么就会创建一个基类的实例对象。
多个值的设定
如果要给一个元素指定多个值,那么几乎总是重复使用这个元素,而不是在一个元素中列出多个值。如:
<intent-filter . . . >
<actionandroid:name="android.intent.action.EDIT"/>
<actionandroid:name="android.intent.action.INSERT"/>
read more