每个应用程序都必须有一个AndroidManifest.xml文件(正好与这个名字)在它的根目录。 清单文件提供了关于您的应用程序的基本信息,以Android系统,信息系统必须具备才可以运行任何应用程序的代码,其中其他的东西,清单执行以下操作:
它的名称为应用程序的Java包。 该包名作为应用程序的唯一标识符。
它描述了该应用程序的组件 - 活动,服务,广播接收器,以及该应用程序由内容提供商。 它的名称是实现每个组件和类发布它们的能力(例如,其Intent的消息它们可以处理)。 这些声明使Android系统知道什么组件以及在什么条件下可以启动。
它决定哪些进程将承载应用程序组件。
它声明哪些权限的应用程序必须有以访问API的被保护部分和与其他应用程序进行交互。
它还宣称,别人都要求有以与应用程序的组件进行交互的权限。
它列出了Instrumentation的应用程序运行,提供分析和其他信息的类。 这些声明只存在于??清单中,而应用程序正在开发和测试; 他们删除了应用程序发布之前。
它声明了Android的API,应用程序需要的最低水平。
它会列出该应用程序必须对链接的库。
的清单文件结构
下图显示了manifest文件,并且它可以包含每个元素的一般结构。 每个元素,连同它的所有属性,记录在全在一个单独的文件。 要查看有关的任何元素的详细信息,请单击图中的元素名称,元素中的字母顺序列表下面的图,或任何其他提及的元素名称。
<?XML版本=“1.0”编码=“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 />
</意图过滤器>
<meta-data />
</活动>
<activity-alias>
<intent-filter> 。 。 。 </意图过滤器>
<meta-data />
</活性别名>
的<service>
<intent-filter> 。 。 。 </意图过滤器>
<meta-data/>
</服务>
<receiver>
<intent-filter> 。 。 。 </意图过滤器>
<meta-data />
</接收器>
的<provider>
<grant-uri-permission />
<meta-data />
<path-permission />
</供应商>
<uses-library />
</应用程序>
</舱单>
所有可以出现在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>
文件约定
一些约定和规则普遍适用于在清单中的所有元素和属性:
分子
只有<manifest>和<application>元素是必需的,他们每个人都必须到场,并只能出现一次。 其余大部份可以出现多次或根本没有 - 但至少他们中的一些必须存在的清单以完成任何有意义。
如果一个元素包含任何东西,它包含其他元素。 所有的值都通过属性设置,而不是作为一个元素中的字符数据。
在同一级别的元素,一般不订购。 例如, <activity> , <provider> ,和<service>元件可以混合在任何序列。 (一<activity-alias>元素是例外:它必须遵循<activity>它是一个别名。)
属性
在正式意义,所有的属性都是可选的。 然而,也有一些必须为实现其目的的元素中指定。 使用文件作为指导。 对于真正的可选属性,它提到了一个默认值,或规定在没有规范会发生什么。
除了 ??根的一些属性<manifest>元素,所有属性名称开头的android:前缀-例如, android:alwaysRetainTaskState 。 因为前缀是通用的,该文件引用通过名称属性时,通常忽略了这一点。
声明类名
许多元素对应的Java对象,包括对应用程序本身元素( <application>其主要成分元素)和-活动( <activity> ),服务( <service> ),广播接收器( <receiver> ),和内容提供商( <provider> )。
如果你定义一个子类,因为你几乎总是会为组件类( Activity , Service , BroadcastReceiver ,和ContentProvider ),子类通过声明的name属性。 该名称必须包含完整的包名称。 例如,一个Service子类可以声明如下:
<舱单。 。 。 >
<应用。 。 。 >
<服务机器人:名称=“com.example.project.SecretService”。 。 。 >
。 。 。
</服务>
。 。 。
</应用程序>
</舱单>
但是,作为一个速记,如果该字符串的第一个字符是一个句点,该字符串被附加到应用程序的包名(具体由<manifest>元素的package属性)。 下面的分配是与上述相同的操作之一:
<舱单包=“com.example.project”。 。 。 >
<应用。 。 。 >
<服务机器人:名称=“。SecretService”。 。 。 >
。 。 。
</服务>
。 。 。
</应用程序>
</舱单>
当启动一个组件,Android的创建了一个名为子类的实例。 如果没有指定一个子类,它创建基类的一个实例。
多个值
如果可以指定一个以上的值,元件几乎都会重复,而不是一个单一的元素中列出的多个值。 例如,一个意图过滤器可以列出几个动作:
<意图过滤器。 。 。 >
<action android:name="android.intent.action.EDIT" />
<action android:name="android.intent.action.INSERT" />
<action android:name="android.intent.action.DELETE" />
。 。 。
</意图过滤器>
资源值
某些属性具有可以显示给用户的值 - 例如,一个标签和一个活动的图标。 这些属性的值应该被本地化,因此从一个资源或主??题设置。 资源值以下面的格式,
@[ package :] type : name
其中如果资源是在同一个包中的应用程序包名称可以省略, 类型是一个类型的资源-如“串”或“可绘” -和名称是标识特定资源的名称。 例如:
<活动机器人:图标=“@绘制/ smallPic”。 。 。 >
从一个主题值以类似的方式,但具有初始' ? ' 而不是' @ ':
?[ package :] type : name
字符串值
这里的属性值是一个字符串,双反斜杠(' \\ ')必须使用转义字符-例如,' \\n '为换行符或“ \\uxxxx的Unicode字符“。
档案功能
以下各节描述了如何一些Android特性都反映在清单文件。
意图过滤器
一个应用程序(它的活动,服务和广 ??播接收器)的核心组件是由意图激活。 intent是一个信息包(一个Intent对象)描述所需的操作-包括了要执行的数据,应该执行的操作组件的类,以及其他相关说明。 Android的找到一个合适的组件的意图做出反应,如果一个需要启动该组件的一个新实例,并将其传递的Intent对象。
组件宣传他们的能力-种意图,他们可以回应的-透过意图过滤器 。 由于Android系统必须了解哪些牴一个组件可以处理它启动该组件之前,意图过滤器在清单中,作为指定的<intent-filter>元素。 一个组件可以具有任何数量的过滤器,每一个都描述了一个不同的功能。
意图明确名称的目标组件将激活该组件; 过滤器不发挥作用。 但是,这并不以名称指定目标的意图可以激活一个组件只有当它能够通过组件的过滤器中的一个。
有关意向对象是如何对抗意图过滤器测试的信息,请参阅单独的文件, 意图和意图过滤器 。
图标和标签
许多元素有icon和label的小图标和文本标签,可以显示给用户的属性。 有些也有一个description的,也可以在屏幕上显示较长的解释性文本属性。 例如, <permission>元素有所有这三个属性,这样当用户被询问是否授予的权限,已经要求它的应用程序,代表权限,权限的名称的图标和描述的它需要什么都可以被呈现给用户。
在任何情况下,在含有元素中设置的图标和标签变成默认icon和label的所有容器的子元素的设定。 因此,在设定的图标和标签<application>元素是每个应用程序的组件的默认图标和标签。 类似地,对于一个组件设置的图标和标签-例如,一个<activity>元件-对于每个组件的默认设置<intent-filter>元素。 如果一个<application>元素设置一个标签,而是一种活动,其意图过滤器不这样做,应用程序标签被当作标签,同时为活动和意图过滤器。
对于一个意图过滤器设置的图标和标签被用来表示当该组件被呈现给用户作为满足由过滤器发布的功能的成分。 例如,“过滤器android.intent.action.MAIN “和” android.intent.category.LAUNCHER “设置宣传活动作为一个启动一个应用程序- ,那就是作为一个应该显示在应用程序启动器。 因此,在过滤器中设置的图标和标签都在发射器中显示的那些。
权限
权限是有限制限制访问代码的一部分或设备上的数据。 的限制,以保护关键数据和代码可以被滥用,歪曲或破坏用户体验。
每个权限是由一个唯一的标签。 通常情况下,标签表示的制约作用。 例如,下面是由Android的一些定义权限:
android.permission.CALL_EMERGENCY_NUMBERS
android.permission.READ_OWNER_DATA
android.permission.SET_WALLPAPER
android.permission.DEVICE_POWER
一个功能可以通过至多一个权限加以保护。
如果应用程序需要访问受权限保护的功能,它必须声明它需要与该权限<uses-permission>在manifest元素。 然后,当应用程序被安装在设备上时,安装程??序判断是否通过检查该签名的应用程序的证书的机构,并且在一些情况下,要求用户授予所请求的许可。 如果授予权限,应用程序能够使用的保护功能。 如果不是,它试图访问这些功能只是没有任何通知用户失败。
应用程序还可以保护它自己的组件(活动,服务,广播接收器,和内容提供商)与权限。 它可以使用任何用的Android(中列出所定义的权限android.Manifest.permission )或其他应用程序中声明。 或者它可以定义它自己的。 一种新的许可与申报<permission>元素。 例如,一个活动可以被保护的,如下所示:
<舱单。 。 。 >
<许可机器人:名称=“com.example.project.DEBIT_ACCT”。 。 。 />
<uses-permission android:name="com.example.project.DEBIT_ACCT" />
。 。 。
<应用。 。 >
<活动机器人:名称=“com.example.project.FreneticActivity”
机器人:权限=“com.example.project.DEBIT_ACCT”
。 。 。 >
。 。 。
</活动>
</应用程序>
</舱单>
注意,在这个例子中, DEBIT_ACCT权限不仅与所声明的<permission>元件,它的使用也要求与<uses-permission>元件。 其使用必须以使应用程序以启动保护活性的其它部件被要求,即使保护是由应用程序本身施加。
如果,在同样的例子中, permission属性被设置为在别处(如宣许可android.permission.CALL_EMERGENCY_NUMBERS ,它不会一直需要一个再次声明它<permission>元素,但仍然一直必要时要求其与使用<uses-permission> 。
该<permission-tree>元素声明为一组,将在代码中定义的权限的命名空间。 和<permission-group>定义了标签的一组权限(包括那些在清单中声明与<permission>元素和其他地方声明的)。 它影响的权限仅当如何呈现给用户进行分组。 该<permission-group>元素没有指定哪些权限属于该组; 它只是给该组的名称。 的许可被放置在组中通过指定组名的<permission>元素的permissionGroup属性。
库
每个应用程序被连接对默认的Android库,其中包括基本的软件包用于构建应用程序(与普通类,如活动,服务,意图,视图,按钮,应用,ContentProvider的,等等)。
然而,一些软件包驻留在自己的库。 如果您的应用程序从任何这些包的使用代码,它必须明确要求要对它们联系起来。 该清单必须包含一个单独的<uses-library>元素来命名每个库。 (库名可以在套件的文档中找到。)