每个Android项目都包含清单文件AndroidManifest.xml,在Android Studio 中,可以在app/manifest中访问到应用的配置清单。
配置清单文件定义了应用的结构、元数据、组件及需求。
配置清单包含构成应用的每个Acitivty
、Service
、Content Provider
和Broadcast Receiver
的节点,并使用Intent Filter
和Permission
来确定他们之间以及其他应用之间的交互方式。
配置清单文件由manifest
根节点标签标记组成,其中的package属性用于设置项目的唯一包名,另外还应该包含xmlns:android
属性,以提供文件中所需的更多系统属性。
下面的xml代码展示了一种典型的配置清单根节点:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="top.xuqingquan.sample">
......
</manifest>
配置清单在application顶级节点中制定了应用的元数据(如图标和主题)。其他顶级节点可以制定任何所需的权限,单元测试,并定义硬件、屏幕或平台需求。
下面列表总结了一些可用的配置清单子节点标签,另外还提供了XML代码片段,以演示如何使用每一个标签:
- uses-feature ——Android 可以在各种硬件平台上使用,可以使用use-feature节点来指定应用正常运行所需的硬件和软件特性。
请注意,这将阻止把应用安装在不包含指定功能的设备上,例如以下代码片段中的NFC硬件:
<uses-feature android:name="android.hardware.nfc"/>
仅当希望防止把应用安装到不包含某些功能特性的设备上时才使用此节点。目前,所支持的必须功能包括以下类别:
· Audio —— 适用于低延迟或专业级音频通道,或者麦克风输入的应用。
· Bluetooth —— 适用于需要蓝牙或者BTLE收音机的地方。
· Camera —— 适用于需要相机的地方。还可以要求(或设置为可选)前置或后、自动对焦、手动后处理、手动传感器、闪光灯或RAW支持。
· Device Hardware UI —— 应用是为特定设备的用户界面设置的,例如汽车或者手表。
· Fingerpring —— 需要能够读取指纹的生物识别硬件。
· Gamepad —— 适用于需要游戏控制器输入的游戏(或应用),无论来自设备自身还是外界的游戏手柄。
· Infrared —— 指明对红外(IR)功能对需求(通常用于与其他用户对红外设备进行通信)。
· Location —— 指明需要基于定位的服务,还可以显示的指定网络或GPS作为支持。
· NFC —— 需要NFC(近场通信)支持。
· OpenGL ES —— 应用需要设备安装上了OpenGL ES 的Android扩展包。
· Sensor —— 可以指定对任何可能可用对硬件传感器的要求,包括加速度计、气压表、罗盘、陀螺仪、传感器,以检测环境温度、心率、光线、接近度、湿度,以及执行步行计数和步行检测等。
· Telephony —— 需要指定普通电话或特定电话无线电(GSM或CDMA)。
· Touchscreen —— 指定应用需要需要的触摸屏类型,包括可以检测和跟踪多种不同的触摸输入。
· USB —— 适用于需要USB主机或者附件模式支持的应用。
· Wi-Fi —— 需要Wi-Fi对网络进行支持。
· 通信软件 —— 应用需要对(SIP)会话初始化协议或(VoIP Internet)协议语音服务提供技术。
· 设备管理软件 —— 使用这些可选的软件功能指定应用需要支持设备管理功能,包括备份服务,设备策略执行、托管用户、用户迁移和启动验证。
· 媒体软件 —— 表明应用对MIDI支持、打印、“后倾”(电视)UI、电视直播或主屏幕小部件有需要。
随着Android平台的种类日益增多,可选的硬件和软件也会越来越多,可以在https://developer.android.google.cn/guide/topics/manifest/uses-feature-element上找到完整的uses-feature硬件列表。
为了保障兼容性,指定某些权限的要求也意味着功能要求。具体来说,在请求访问蓝牙、相机权限、任向位置服务权限、音频录制、Wi-Fi和电话相关权限的许可时,意味着需要相应的硬件功能。可以通过添加required属性并设置为false 来重写这些隐含的要求,例如,支持但不需要)录制音频笔记的记录应用可以选择使用克风硬件选项:
<uses-feature
android:name="android.hardware.microphone"
android:required="false" />
相机硬件也代表了-种特殊的情况。出于兼容性的考虑,请求使用相机的权限,或者添加一个需要它的 !uses-feature节点,意味着要求相机支持自动对焦。可以根据需要将其指定为可选的:
<uses-feature android:name="android.hardware.camera" />
<uses-feature
android:name="android.hardware.camera.autofocus"
android:required="false" />
<uses-feature
android:name="android.hardware.camera.flash"
android:required="false" />
- supports-screens —— 随着数百种大小、分辨率和密度不同的屏幕的增加,以及多窗口模式的引入,应该为应用创建响应式UI设计,从而为所有的用户提供良好的体验。虽然在技术上可以使用supports-screens节点将应用的可用性限制为仅受支持的屏幕分辨率的子集,但这被认为是不好的做法,所以应该尽量避免。
- supports-gl-texture —— 声明应用能够提供使用特定GL纹理压缩格式压缩的纹理资源。如果应用能够支持多种纹理压缩格式,则必须使用多个supports-gl-texture节点元素。可以在https://developer.android.google.cn/guide/topics/manifest/supports-gl-texture-element上了解到支持的GL纹理压缩格式值的最新列表。
- uses-permission —— 作为安全模块的一部分,uses-permission标签声明应用所需要的用户权限。指定的每个权限将在应用安装之前(运行在Android 5.1或更低版本的设备上)或在应用运行时(运行在Android 6.0或更高版本的设备上)呈现给用户。许多API和方法调用都需要权限,通常是那些具有相关成本或安全隐患的API和方法调用(例如拨号、接收SMS或使用基于位置的服务)。我们会根据需要在本书其余部分介绍这些内容。
- permission —— 共享的应用组件也可以创建权限,以限制来自其他应用组件的访问。可以使用现有平台权限来实现此目的,也可以在配置清单中定义自己的权限。为此,请使用permission标签创建权限定义。可以指定权限允许的访问级别(正常(normal)、危险(dangerous)、签名(signature)、签名或系统(signatureOrSystem)、标签和外部资源,其中包含解释授予指定权限的风险说明。
- application —— 配置清单中只能包含一个application 节点。它通过属性来指定应用的元数据(metadata),包括名称(name)、图标(icon)和主题(theme)。还可以指定是否允许使用自动备份数据(Android Auto Backup),以及是否支持从右到左的UI布局。如果正在使用自定义的Application类,那么必须使用android:name属性在此处指定它。application节点还可以充当指定的应用组件——Activity、Service、Content Provider和BroadcastReceiver节点的容器。
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:theme="@style/AppTheme">
</application>
- activiy —— 应用中的每个 Activity都需要一个 activity 标签,并使用android:name属性来指示Activity的类名。必须包含主启动Activity以及可能会显示的其他任何Activiy.如果尝试启动未包含在配置清单中的Activity,则会触发运行时异常。每一个activity节点都支持intent-filter子标签,用于定义可用于启动Activity的Intent.
注意,在指定Activity的类名时,前面的句点(英文句点)是应用的包名的缩写:
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- service —— 与activity标签一样,为应用中使用的每个Service类添加一个service标签。
<service android:name="MyService"/>
- provider —— provider 标签指定应用中的每个Content Provider,Content Provider 用于管理数据库的访问和共享。
- receiver —— 通过添加receiver标签,不需要先启动应用就能注册一个Broadcast Receiver。Broadcast Receiver就像全局事件监听器。注册之后,每当系统广播匹配了对应的Intent时,它就会执行。通过在配置清单中注册Broadcast Receiver,就可以使此过程完全自治。
<receiver android:name=".MyReceiver"/>