清单文件
在 Android 系统启动应用组件之前,系统必须通过读取应用的 AndroidManifest.xml
除了声明应用的组件外,清单文件还有许多其他作用,如:
- 确定应用需要的任何用户权限,如互联网访问权限或对用户联系人的读取权限(Android 6.0以上某些权限需要动态获取,点此进入查看哪些需要动态获取)
- 根据应用使用的 API,声明应用所需的最低 API 级别(点此查看android系统版本分布统计数据)
- 声明应用使用或需要的硬件和软件功能,如相机、蓝牙服务或多点触摸屏幕
- 应用需要链接的 API 库(Android 框架 API 除外),如 Google 地图库
- 其他功能
声明组件
清单文件的主要任务是告知系统有关应用组件的信息。例如,清单文件可以像下面这样声明 Activity:
<?
xml version
=
"1.0"
encoding
=
"utf-8"
?>
<manifest
...
>
<application
android:icon
=
"@drawable/app_icon.png"
...
>
<activity
android:name
=
"com.example.project.ExampleActivity"
android:label
=
"@string/example_label"
...
>
</activity>
...
</application>
</manifest>
在 <application>
元素中,android:icon
在 <activity>
元素中,android:name
属性指定 Activity
子类的完全限定类名,android:label
您必须通过以下方式声明所有应用组件:
- Activity 的
<activity>
- 服务的
<service>
- 广播接收器的
<receiver>
- 内容提供程序的
<provider>
您包括在源代码中,但未在清单文件中声明的 Activity、服务和内容提供程序对系统不可见,因此也永远不会运行。 不过,广播接收器可以在清单文件中声明或在代码中动态创建(如 BroadcastReceiver
对象)并通过调用 registerReceiver()
声明组件功能
如上文启动组件中所述,您可以使用 Intent
系统通过将接收到的 Intent 与设备上的其他应用的清单文件中提供的 Intent 过滤器进行比较来确定可以响应 Intent 的组件。
当您在应用的清单文件中声明 Activity 时,可以选择性地加入声明 Activity 功能的 Intent 过滤器,以便响应来自其他应用的 Intent。 您可以通过将 <intent-filter>
元素作为组件声明元素的子项进行添加来为您的组件声明 Intent 过滤器。
例如,如果您开发的电子邮件应用包含一个用于撰写新电子邮件的 Activity,则可以像下面这样声明一个 Intent 过滤器来响应“send” Intent(以发送新电子邮件):
<manifest
...
>
...
<application
...
>
<activity
android:name
=
"com.example.project.ComposeEmailActivity"
>
<intent-filter>
<action
android:name
=
"android.intent.action.SEND"
/>
<data
android:type
=
"*/*"
/>
<category
android:name
=
"android.intent.category.DEFAULT"
/>
</intent-filter>
</activity>
</application>
</manifest>
然后,如果另一个应用创建了一个包含ACTION_SEND
操作的 Intent,并将其传递到 startActivity()
,则系统可能会启动您的 Activity,以便用户能够草拟并发送电子邮件。
声明应用要求
基于 Android 系统的设备多种多样,并非所有设备都提供相同的特性和功能。 为防止将您的应用安装在缺少应用所需特性的设备上,您必须通过在清单文件中声明设备和软件要求,为您的应用支持的设备类型明确定义一个配置文件。 其中的大多数声明只是为了提供信息,系统不会读取它们,但 Google Play 等外部服务会读取它们,以便当用户在其设备中搜索应用时为用户提供过滤功能。
例如,如果您的应用需要相机,并使用 Android 2.1(API 级别
<manifest
...
>
<uses-feature
android:name
=
"android.hardware.camera.any"
android:required
=
"true"
/>
<uses-sdk
android:minSdkVersion
=
"7"
android:targetSdkVersion
=
"19"
/>
...
</manifest>
现在,没有相机且 Android 版本低于 2.1 的设备将无法从 Google Play 安装您的应用。
不过,您也可以声明您的应用使用相机,但并不要求必须使用。 在这种情况下,您的应用必须将 required
属性设置为 "false"
,并在运行时检查设备是否具有相机,然后根据需要停用任何相机功能。
设备兼容性文档中提供了有关如何管理应用与不同设备兼容性的详细信息。