Android应用清单
每个Android应用的根目录中都必须包含一个AndroidManifest.xml文件。清单文件向Android系统提供必要信息,系统必须具有这些信息方可运行应用的任何代码。
清单文件可执行以下操作:
- 为应用的Java软件包命名。软件包名称充当应用的唯一标识符。
- 描述应用的各个组件,包括构成应用的Activity、Service、BroadcastReceiver和ContentProvider。它还为实现每个组件的类命名并发布其功能。这些声明向Android系统告知有关组件以及可以启动这些组件的条件的信息。
- 确定托管应用组件的进程。
- 声明应用必须具备哪些权限才能访问API中受保护的部分并与其他应用交互。还声明其他应用与该应用组件交互所需具备的权限。
- 列出Instrumentation类,这些类可在应用运行时提供分析和其他信息。这些声明只会在应用处于开发阶段时出现在清单中,在应用发布之前将移除。
- 声明应用所需的最低AndroidAPI级别。
- 列出应用必须链接到的库。
注意:准备要在Chromebook上运行的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>
注意:这些是仅有的合法元素(我们无法添加自己的元素或属性)。
文件约定
1.元素
- 只有
<manifest>
和<application>
元素是必需的,这两个元素都必须存在并且只能出现一次。其他大部分元素可以出现多次或者不出现。但是清单文件中必须至少存在其中某些元素才有用。 - 如果一个元素包含其他元素。所有值均通过属性进行设置,而不是通过元素内的字符数据设置。
- 同一级别的元素通常不分先后顺序。这条规则有两个主要的例外:
-
<activity-alias>
元素必须跟在别名所指的<activity>
之后。 -
<application>
元素必须是<manifest>
元素内最后一个元素。
2.属性
- 从某种意义上说,所有属性都是可选的。但是,必须指定某些属性,元素才可实现其目的。对于真正可选的属性,它将指定默认值或声明缺乏规范时将执行何种操作。
- 除了根
<manifest>
元素的一些属性外,所有属性名称均以android前缀开头。
3.声明类名
许多元素对应于Java对象,包括应用本身的元素(<application>
元素)及其主要组件:Activity、Service、BroadcastReceiver以及ContentProvider。
声明子类可以有下面两种方式:
<manifest . . . >
<application . . . >
<service android:name="com.example.project.SecretService" . . . >
. . .
</service>
. . .
</application>
</manifest>
<manifest package="com.example.project" . . . >
<application . . . >
<service android:name=".SecretService" . . . >
. . .
</service>
. . .
</application>
</manifest>
当启动组件时,Android系统会创建已命名子类的实例。如果未指定子类,则会创建基类的实例。
4.多个值
如果可以指定多个值,则几乎总是在重复此元素,而不是列出单个元素内的多个值。例如,intent过滤器可以列出多个操作:
<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>
5.资源值
某些属性的值可以显示给用户。这些属性的值应该本地化,并通过资源或主题进行设置。资源值用以下格式表示:
@[<i>package</i>:]<i>type</i>/<i>name</i>
主题中的值用类似的方法表示,但是以?开头,而不是以@开头:
?[<i>package</i>:]<i>type</i>/<i>name</i>
6.字符串值
如果属性为字符串,则必须使用双反斜杠(\)转义字符,例如:使用\n表示换行。
文件功能
1.Intent过滤器
应用的核心组件由Intent激活。Intent是一系列用于描述所需操作的信息,其中包括要执行操作的数据、应执行操作的组件类别以及其他相关说明。Android系统会查找合适的组件来响应intent,根据需要启动组件的新实例,并将其传递到Intent对象。
2.图标和标签
对于可以显示给用户的小图标和文本标签,大量元素具有icon和label属性。此外,对于同样可以显示在屏幕上的较长说明文本,某些元素还具有description属性。
无论何种情况下,在包含元素中设置的图标和标签都将成为所有容器子元素的默认icon和label设置。
在实现过滤器公布的功能时,只要向用户呈现组件,系统便会使用为intent过滤器设置的图标和标签标示该组件。
3.权限
- 权限是一种限制,用于限制对部分代码或设备上数据的访问。施加限制是为了保护可能被误用以致破坏或损害用户体验的关键数据和代码。
- 每种权限均由一个唯一的标签标识。标签通常指示受限制的操作。一个功能只能由一种权限保护。
- 如果应用需要访问受权限保护的功能,则必须在清单中使用
<uses-permission>
元素声明应用需要该权限。将应用安装到设备上之后,安装程序会通过检查签署应用证书的颁发机构并询问用户,确定是否授予请求的权限。如果授予权限,则应用能够使用受保护的功能。否则,其访问这些功能的尝试将会失败,并且不会向用户发送任何通知。 - 应用也可以使用权限保护自己的组件。可以采用Android定义或由其他应用声明的任何权限。也可以定义自己的权限。新权限用
<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权限不仅通过<permission>
元素来声明,而且还通过<uses-permission>
元素来请求。要让应用中的其他组件也能够启动受保护的Activity,必须请求其使用权限,即便保护是由应用本身施加的也要如此。
-
<permission-tree>
元素声明为代码中定义的一组权限声明命名空间; -
<permission-group>
为一组权限定义标签,包括在清单中使用<permission>
元素生命的权限以及在其他位置声明的权限。 -
<permission-group>
元素并不指定属于该组的权限,而只是为组提供名称。通过向<permission>
元素的permissionGroup属性分配组名,将权限放入组中。
4.库
每个应用均链接到默认的Android库,这个库中包括用于开发应用的基本软件包。
如果应用使用来自其中任一软件包的代码,则必须明确要求其链接到这些软件包。清单必须包含单独的<uses-library>
元素来命名其中每个库。
网友评论