清单文件The AndroidManifest.xml File
每个应用程序都有一个AndroidManifest.xml文件(一定是这个名字)在它的根目录里。这个清单文件给Android系统提供了关于这个应用程序的基本信息,系统在能运行任何程序代码之前必须知道这些信息。AndroidManifest.xml主要包含以下功能:
命名应用程序的Java包,这个包名用来唯一标识应用程序;
描述应用程序的组件-活动,服务,广播接收者,以及组成应用程序的内容提供器;对实现每个组件和公布其能力(比如,能处理哪些意图消息)的类进行命名。这些声明使得Android系统了解这些组件以及在什么条件下可以被启动;
决定应用程序组件运行在哪个进程里面;
声明应用程序所必须具备的权限,用以访问受保护的部分API,以及和其它应用程序交互;
声明应用程序其他的必备权限,用以组件之间的交互;
列举测试设备Instrumentation类,用来提供应用程序运行时所需的环境配置及其他信息,这些声明只在程序开发和测试阶段存在,发布前将被删除;
声明应用程序所要求的Android API的最低版本级别;
列举application所需要链接的库;
清单文件结构Structure of the Manifest File
下面的图表显示了清单文件的基本结构以及它能包含的所有元素。每个元素,和它所有的属性,在一个单独的文件中完整描述。要查看任何元素的细节信息,可在图表下方的以字符序排列的元素列表中点击其元素名称。
所有清单文件中可能出现的元素按字符序排列如下。只有这些元素是合法的,你不能添加自己的元素或属性:
文件约定File Conventions
下面是一些清单文件中适用于所有元素和属性的约定和规则:
元素Elements:
在所有的元素中只有
属性Attributes:
正规意义上,所有的属性都是可选的,但实际上有些属性是必须为一个元素指定来完成其目标。把这篇文档当作一个指南。对于那些真正可选的属性,即使不存在一个规格,也会有默认的数值或状态。
除了根元素
声明类名Declaring class names:
很多对应于Java对象的元素,包括应用程序自己(
如果你定义一个子类,就像你将经常为组件类(Activity, Service, BroadcastReceiver, 和ContentProvider)所做的那样,这个子类通过一个名字属性来声明。这个名字必须包含完整的包名称。比如,一个服务Service子类可能会声明如下:
. . .
. . .
不过,作为类名的简写,如果这个字符串的第一个字符是一个点号“.”,那么这个字符串将被扩展到应用程序包名的后面(正如
. . .
. . .
当启动一个组件时,Android创建了一个命名子类的实例。如果没有指定一个子类,它创建基类的一个实例。
多数值项Multiple values:
如果某个元素有超过一个数值,这个元素几乎总是需要被重复声明,而不能将多个数值项列举在一个属性中。比如,一个意图过滤器可以列举多个动作:
. . .
资源项Resource values:
一些属性有能显示给用户的数值-比如,活动(activity)的一个标签和图标。这些属性的值应该被本地化,从一个资源或主题中设置。当需要引用某个资源时,采用如下的表述格式:
@[package:]type:name
这里package名称可以被忽略,要是资源和应用程序在同一个包里的话;type是资源的类型-如"string"或"drawable"-而且name是用来标识特定资源的名字。例如
从主题获取的数据以类似的方式表述,不过以'?'而不是'@'开头。
?[package:]type:name
字符串值String values:
如果属性值是一个字符串,则必须使用双反斜杠('\\')来表示escape('\')字符;第一个反斜杠起转义字符的作用)。比如,'\ '表示换行或'\\uxxxx'表示一个Unicode字符。
文件特性File Features
下面的章节描述了一些Android特性如何被映射到清单(manifest)文件中。
意图过滤器Intent Filters
应用程序的核心组件(活动,服务和广播接收器)通过意图被激活。意图是描述期望动作的信息包(一个Intent 对象)-包括要操作的数据,执行该动作的组件类别,以及其他有关指令。Android寻找一个合适的组件来响应这个意图,如果需要会启动这个组件一个新的实例,并传递给这个意图对象。
组件通过意图过滤器(intent filters)通告它们所具备的能力-能响应的意图类型。由于Android系统在启动一个组件前必须知道该组件能够处理哪些意图,那么意图过滤器需要在manifest中以
一个显式命名目标组件的意图将会激活那个组件;过滤器不起作用。但是一个没有指定目标的意图只在它能够通过组件过滤器任一过滤器时才能激活该组件。
请查看关于意图和意图过滤器的文档以获取更多信息:Intents and Intent Filters.
图标和标签Icons and Labels
许多元素有图标(icon)和标签(label)属性。其中一些还有一个描述(description)属性,可以用更长的解释性文字呈现给用户。比如,
所有的情况中,设置在一个包含元素里的图标和标签会成为该容器所有子元素的缺省设置。这样,在
当呈现给用户的组件实现一个意图过滤器公告的函数时,为这个过滤器设置的图标和标签将被用来代表这个组件。比如,一个设置了"android.intent.action.MAIN"和"android.intent.category.LAUNCHER"的过滤器公告了一个活动来初始化应用程序-也就是,会被显示在应用程序启动器中。因此设置在过滤器中的图标和标签也就是显示在启动器里的那些图标和标签。
许可Permissions
一个许可(permission)是代码对设备上数据的访问限制。这个限制被引入来保护可能会被误用而曲解或破坏用户体验的关键数据和代码。
每个许可被一个唯一的标签所标识。这个标签常常指出了受限的动作。例如,下面是一些Android定义的许可:
android.permission.CALL_EMERGENCY_NUMBERS
android.permission.READ_OWNER_DATA
android.permission.SET_WALLPAPER
android.permission.DEVICE_POWER
一个功能(feature)最多只能被一个权限许可保护。
如果一个应用程序需要访问一个需要特定权限的功能,它必须在manifest文件中使用
应用程序还可以通过权限许可来保护它自己的组件(活动,服务,广播接收器,和内容提供器)。它可以利用Android已经定义(列在android.Manifest.permission里)或其他应用程序已声明的权限许可。或者定义自己的许可。一个新的许可通过
. . .
android:permission="com.example.project.DEBIT_ACCT"
. . . >
. . .
. . .
. . .
注意,在这个例子里,这个DEBIT_ACCT 许可并非仅仅在
如果,就在这个例子里,这个permission 属性被设置为在其他地方声明的权限许可(例如android.permission.CALL_EMERGENCY_NUMBERS,它将不需要再次声明它,但是,它仍然需要通过
这个
库Libraries
每个应用程序都链接到缺省的Android库,这个库包含了基础应用程序开发包(实现了基础类如活动,服务,意图,视图,按钮,应用程序,内容提供器,等等)
然而,一些包处于它们自己的库中。如果你的应用程序使用了其他开发包中的代码,它必须显式的请求链接到它们。这个manifest必须包含一个单独的
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/iefreer/archive/2009/09/10/4540172.aspx
来源:oschina
链接:https://my.oschina.net/u/16/blog/3285