Android 程序清单文件详解

每个Android应用都需要一个名为AndroidManifest.xml的程序清单文件,这个清单文件名是固定的并且放在每个Android应用的根目录下。它定义了该应用对于Android系统来说一些非常重要的信息。Android系统需要这些信息才能正常运行该应用。Android程序清单文件主要具有下面作用:

·它给应用程序Java包命名,这个包名作为应用程序唯一标识符。

·它描述了应用程序中的每个程序组件—Activity,Service,Broadcast Receivers和Content Provider。它描述了实现每个应用程序组件的类名称和组件能力(比如组件能够处理哪种类型的Intent消息)。这些描述帮助Andoid操作系统了解这些程序组件和在何种条件下可以启动这些程序组件。

·它决定哪些进程用来运行应用程序组件。

·它描述了应用程序使用某些受保护的程序API或和其它应用程序交互所需的权限。

·它也描述了其它应用程序和该应用交互时应拥有的权限。

·它列出了Instrumentation类用于提供应用程序运行时一些性能统计和其它信息。这些生命只在测试或开发应用时使用。在发布应用时应该删除。

·它给出了应用运行所需AndroidAPI版本的最低要求。

·它列出了应用程序需要调用的开发库定义。

清单文件结构

下面XML代码给出了程序清单文件的基本结构以及它所能包含的所有元素。每个元素及元素支持的属性可以参考Android开发文档。

<?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>

程序清单文件支持的所有元素按其字母顺序排列如下,它们是程序清单支持的合法元素,你不能添加自定义的元素和属性。

<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>

一些使用惯例

下面为使用元素和属性时一些惯例和原则:

元素

只有<mainifest>和<application>元素是必须的,这两个元素必须在程序清单中定义,并且只能出现一次。其它元素可以不出现或出现多次—尽管其中有些元素是一个有实用意义的程序清单文件所必须的。

如果一个元素包含其它元素,所有的值都是通过属性来定义而不是通过元素内容来定义。

同一层次的元素之间没有先后顺序的关系。比如<activity>,<provider>和<service>可以以任何次序出现或交替出现(一个特例是<activity-alias>,它必需紧跟在它对应的<activity>之后)

属性

严格上来说,所有的属性都是可选的。但实际上必须定义某些元素的属性值才能使用该元素有实际意义。具体可以参考开发文档,如果某个属性确实是可选的,开发文档定义了它的缺省值。

除了根元素<manifest>的一些属性,其它所有属性的属性名称都是以android:作为前缀。比如android:alwaysRetainTaskState。

申明类名称

有很多元素对应到某个Java对象,包括应用程序元素本身(<application>元素)和一些主要的程序组件—Activity(<activity>),Service(<service>,BroadcastReceiver (<receiver>)和ContentProvider(<provider>)。

如果你定义子类,对于应用程序组件(Activity,Service,BroadcastReceiver和ContentProvider)来说,这是非常普遍的情况。子类名称通过name属性来定义。这个名成必须包括类定义完整的包定义。比如一个Service的子类可以有如下定义:

<manifest . . . ><application . . . ><service android:name="com.example.project.SecretService" . . . >. . .</service>. . .</application></manifest>

然而,为了简化起见,如果name属性的第一个字符为“.”,那么name属性的值会添加到应用程序包名称(由<manifest>元素的<package>属性定义)作为完整的类名称。下面代码实现上面代码同样的功能:

<manifest package="com.example.project" . . . ><application . . . ><service android:name=".SecretService" . . . >. . .</service>. . .</application></manifest>

Android系统中启动某个程序组件时会创建该子类的一个实例,如果没有指明子类的名称,Android系统将创建其基类的实例。

多个值

如果可以为某个元素设置多个值,那么对每个值都要重复元素定义,而不使用一个元素定义定义多个值。比如,一个intent可以使用多个过滤动作:

愈想得到,就愈要放手。放手是很难的,但是别无选择。

Android 程序清单文件详解

相关文章:

你感兴趣的文章:

标签云: