应用清单
每个应用程序都必须在其根目录中的Andr??oidManifest.xml文件(正是名)。清单文件提供了关于您的应用程序到Android系统,该系统必须具备才可以运行任何应用程序的代码信息的基本信息。除其他事项外,清单执行以下操作:
它的名字的Java包的应用程序。该包名作为应用程序的唯一标识符。
它描述了应用程序的组件 - 该应用程序是由活动,服务,广播接收机,和内容提供商。它指定了实现每个组件并公布它们的能力(例如,其意图的消息,他们可以处理)类。这些声明使Android系统知道这儿有什么组件和下它们可以被载入什么条件。
它决定那些进程将容纳应用程序组件。
它声明其权限的应用程序必须拥有访问API的被保护部分,并与其他应用程序进行交互。
它也声明了其他需要有以与应用程序的组件进行交互的权限。
它列出了Instrumentation类,可以在应用程序运行时提供简档和其他信息。这些声明出现在清单中仅当应用程序被开发和测试;在应用程序发布之前他们删除。
它声明应用程序所需的Andr??oid API的最低水平。
它列出了该应用程序必须链接的库。
清单文件的结构
下面的图显示了清单文件,并且它可以包含每一元件的一般结构。每个元素,与所有它的属性一起被记录在全在一个单独的文件中。要查看有关的任何元素的详细信息,点击该元素的名称在图中,在下面的图,或元素名称的任何其他提及的元素的字母顺序排列。
?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>
所有可以出现在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>
文件约定
一些约定和规则普遍适用于在清单中的所有元素和属性:
分子
只有<清单>和<应用>元素是必需的,它们都必须存在,并且只能出现一次。大部分的人都可以发生多次或根本不出现 - 尽管至少他们中的一些必须存在的清单来完成任何有意义的事。
如果一个元素包含任何东西,它包含其他元素。所有值都通过属性设置,而不是一个元素内的字符数据。
在同一水平的元素之间通常是无序。例如,<活动>,<提供商>和<服务>元素可以任意顺序混合。 (安<活动别名>元素是例外:它必须遵循<活动>它是一个别名)。
属性
在形式上,所有的属性都是可选的。然而,也有一些必须为实现其目的的元件被指定。使用文件作为指导。对于真正的可选属性,它记载了默认值或状态在没有规范的会发生什么。
除了根<清单>元素的一些属性,所有的属性名开头的机器人:前缀 - 例如,Android版:alwaysRetainTaskState。因为前缀是共通的,文件的名字提及一个属性时忽略它。
声明类名
许多元素对应的Java对象,包括应用程序本身(<application>元素)和它的主要成分元素 - 活动(<活动>),服务(<服务>),广播接收机(<接收>)和内容提供商(<提供商>)。
如果你定义一个子类,如同你总是会为组件类(活动,服务,广播接收器和ContentProvider的),该子类通过一个name属性声明。该名称必须包括完整的包。例如,一个服务子类可以声明如下
<manifest . . . > <application . . . > <service android:name="com.example.project.SecretService" . . . > . . . </service> . . . </application> </manifest>
但是,作为一个缩写,如果字符串的第一个字符是句号,该字符串添加到应用程序的包名(由<清单>元素的package属性指定)。以下分配是与上述相同的操作之一:
<manifest package="com.example.project" . . . > <application . . . > <service android:name=".SecretService" . . . > . . . </service> . . . </application> </manifest>
当开始一个部件,机器人创建名称子类的实例。如果没有指定一个子类,它创建的基类的一个实例。
多个值
如果可以指定一个以上的值,该元素将被重复,而不是一个单一的元素中列出的多个值。例如,一个意图过滤器可以列出几个动作:
<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>
资源值
一些属性具有可以显示给用户的值 - 例如,一个标签和一个活动的图标。这些属性的值应该被本地化,由一个资源或主题设置。资源值在以下格式表示,
@ [包:]类型:名称
这儿,如果该资源在同一个包中的应用程序可以省略包名,类型是资源的种类 - 例如“string”或“绘” - 和名称是标识特定资源的名称。 例如:
<activity android:icon="@drawable/smallPic" . . . >
从一个主题的值以类似的方式表示,但与初始“?”而不是 ‘@‘:
?[包:]类型:名称
字符串值
当一个属性值是一个字符串,反斜杠(‘\\‘)必须使用转义字符 - 例如,‘\\ n‘但对一个新行或‘\\ uxxxx‘代表一个Unicode字符。
文件功能
下面的章节描述了一些Android功能是如何体现在manifest文件。
意图过滤器
一个应用程序的核心组件(活动,服务和广播接收器)被激活的意图。一个意图是信息描述所需的操作捆绑(一个Intent对象) - 包含了要执行的数据,分量应该执行的操作的类别,以及其他相关的说明。机器人定位一个适当的部件向意图做出响应,启动是否需要一个组件的一个新实例,并将其传递意图对象。
组件公布其功能的 - 种意图,他们可以回应 - 通过意图过滤器。由于Android系统必须了解哪些主意,组件它启动组件之前可以处理,意图过滤器清单中指定为<意图过滤器>元素。一个组件可以具有任何数量的过滤器,每一个描述一个不同的能力。
意图明确指定了目标组件将激活该组件;过滤器不发挥作用。但是,这并不以名称指定的目标的意图可以激活仅当它可以穿过组件的过滤器中的一个组成部分。
关于intent对象如何对抗意图过滤器进行测试的信息,请参阅单独的文档,意图和意图过滤器。
图标和标签
许多元素都有一个小图标,可以显示给用户的文本标签图标和标签的属性。有些人也有,也可以在屏幕上显示较长的说明性文字描述属性。例如,在<权限>元件具有这三个属性,从而当用户被询问是否许可授予已经请求它的应用程序,代表许可,许可的名称和描述的图标的它需要什么都可以呈现给用户。
在任何情况下,在一个包含元素的图标和标签设置成为所有容器的子元素的默认图标和标签设置。因此,在<application>元素的图标和标签设置是每个应用程序的组件的默认图标和标签。同样,图标和标签设置一个组件 - 例如,<活动>元素 - 是每个组件的<意向过滤>元素的默认设置。如果<application>元素设置了一个标签,但是activity和它的intent filter没有,应用标签将被视为标签活动和意图过滤两种。
对于意图滤波器中设定的图标和标签被用于每当组件被呈现给用户作为满足由过滤器发布的函数来表示的部件。例如,一个带有“android.intent.action.MAIN”和“android.intent.category.LAUNCHER”设置的filter的活动为一体,启动一个应用程序 - 也就是说,作为一个应该被显示在应用程序启动器。因此,在过滤器中设置的图标和标签都显示在启动器的人。
权限
权限是对代码的或在设备上的数据的一部分的限制的限制访问。的限制,以保护关键数据和可能被滥用扭曲或破坏用户体验的代码。
每个权限是由一个唯一的标签识别。通常情况下,标签表明是受限制的动作。例如,这里是由Android定义的一些权限:
android.permission.CALL_EMERGENCY_NUMBERS
android.permission.READ_OWNER_DATA
android.permission.SET_WALLPAPER
android.permission.DEVICE_POWER
一个功能可以最多由一个权限进行保护。
如果应用程序需要访问由权限保护的功能,它必须声明它需要在清单的<使用许可权>元素的权限。然后,当安装在设备上的应用程序,安装程序判断是否通过检查签名应用程序的证书,并且在一些情况下,当局,要求用户授予所请求的权限。如果授予权限,应用程序能够使用受保护的功能。如果没有,尝试访问那些特性将直接失败并且没有任何通知给用户。
应用程序还可以保护它自己的组件(活动,服务,广播接收器,和内容提供商)的权限。它可以使用任何由Android(在android.Manifest.permission列出)定义或其他应用程序中声明的权限。或者,它可以定义自己。一个新的许可申报与<许可>元素。例如,一个活动可以得到保护如下:
<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权限不仅与<权限>元素声明,它的使用也要求与<用途-权限>元素。其使用必须请求,以便启动保护的活动的应用程序的其它部件,即使保护是由应用自身强加的。
如果在相同的例子,许可属性被设置为其他地方声明权限(比如android.permission.CALL_EMERGENCY_NUMBERS,它不会有必要用<许可>元素再次声明。但是,它仍然会被必要要求它的使用与<使用许可权>。
在<许可树>元素为一组,将在代码中被定义权限的命名空间。和<权限组>定义标签一组权限(包括那些在清单与<许可>元素和其他那些宣称声明)。它仅影响如何呈现给用户时的权限进行分组。在<权限组>元素不指定哪些许可属于该组;它只是提供了一个组名。权限是通过分配组名称为<许可>元素的permissionGroup属性,放置在一组。
图书馆
每一个应用程序对默认的Andr??oid库,其中包括用于构建应用程序的基本包联(与普通类,如活动,服务,意图,浏览,按钮,应用程序,ContentProvider的,等等)。
然而,一些软件包驻留在自己的图书馆。如果应用程序使用任何这些软件包的代码,就必须明确要求对他们进行联系。清单必须包含一个单独的<用途库>元素命名每个库。 (库名可以为包的文档中找到。)
<action>
句法
<action android:name="string" />
包含于:
<intent-filter>
描述:
增加了一个意图过滤器的操作。一个<意图-filter>元素必须包含一个或多个<动作>元素。如果它不包含任何没有意图目的将通过过滤器得到的。请参阅有关意图过滤器的细节和动作规格的过滤器中的作用意图和意图过滤器。
属性:
android:name
动作的名称。某些标准动作是在意图类操作字符串常量定义。为了分配这些行动,这个属性之一,在前面加上“android.intent.action”。到后面ACTION_字符串。例如,对于ACTION_MAIN,用“android.intent.action.MAIN”和ACTION_WEB_SEARCH,用“android.intent.action.WEB_SEARCH”。
对于您定义的动作,最好使用包名作为前缀,以确保其唯一性。例如,如下一个TRANSMOGRIFY操作可能指定:
<action android:name="com.example.project.TRANSMOGRIFY" />