AndroidManifest
官方解释是应用清单(Manifest
意思是货单),每个应用的根目录中都必须包含一个,并且文件名必须一模一样。这个文件中包含了APP
的配置信息,系统需要根据里面的内容运行APP
的代码,显示界面。
以下 XML
文件为 AndroidManifest.xml
的一个简单示例,该示例为应用声明两个Activity
。
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
android:versionCode="1"
android:versionName="1.0"
package="com.example.myapp">
<!-- Beware that these values are overridden by the build.gradle file -->
<uses-sdk android:minSdkVersion="15" android:targetSdkVersion="26" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:roundIcon="@mipmap/ic_launcher_round"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<!-- This name is resolved to com.example.myapp.MainActivity
based upon the package attribute -->
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".DisplayMessageActivity"
android:parentActivityName=".MainActivity" />
</application>
</manifest>
首先,所有的xml
都必须包含<manifest>
元素。这是文件的根节点。它必须要包含<application>
元素,并且指明xmlns:android
和package
属性。
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
android:versionCode="1"
android:versionName="1.0"
package="com.example.myapp">
这个属性定义了Android
命名空间。必须设置成"http://schemas.android.com/apk/res/android"。不要手动修改。
包名也代表着唯一的application ID
,用来发布应用。包名由英文字母(大小写均可)、数字和下划线组成。每个独立的名字必须以字母开头。
内部的版本号。用来表明哪个版本更新。这个数字不会显示给用户。显示给用户的是versionName
。这个数字必须是整数。不能用16
进制,也就是说不接受0x1
这种参数
显示给用户看的版本号。
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:roundIcon="@mipmap/ic_launcher_round"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
应用的声明。此元素包含用于声明每个应用组件的子元素,并且具有会影响所有组件的属性。其中许多属性(如 icon、label、permission、process、taskAffinity
和 allowTaskReparenting
)会为组件元素的相应属性设置默认值。其他属性(如 debuggable、enabled、description
和 allowClearUserData
)则为整个应用设置值,并且不能被组件替换。
是否允许应用参与备份和恢复基础架构。如果将此属性设为 false
,则永远不会为该应用执行备份或恢复,即使是采用全系统备份方法也不例外(这种备份方法通常会通过 adb
保存所有应用数据)。此属性的默认值为 true
。
声明可用于限制对此应用或其他应用的特定组件或功能的访问权限的安全权限。
权限的名称
说明权限中隐含的潜在风险,并指示系统在确定是否将权限授予请求授权的应用时应遵循的流程。
每个保护级别都包含基本权限类型以及零个或多个标记。例如,dangerous
保护级别没有标记。相反,保护级别 signature|privileged
是 signature
基本权限类型和 privileged
标记的组合。
指定用户必须授予的系统权限,以便应用正常运行。当(在运行 Android 5.1
和更低版本的设备上)安装应用或(在运行 Android 6.0
和更高版本的设备上)运行应用时,用户会授予权限。
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
权限的名称。可以是应用通过<permission>
元素定义的权限、另一个应用定义的权限,或者一个标准系统权限(例如 "android.permission.CAMERA"
或 "android.permission.READ_CONTACTS"
)。如这些示例所示,权限名称通常以软件包名称为前缀。
此权限应授予应用的最高 API
级别。如果从某个API
级别开始不再需要应用所需的权限,则设置此属性非常有用。
例如,从 Android 4.4
(API 级别 19)开始,应用在外部存储空间写入其特定目录(getExternalFilesDir()
提供的目录)时不再需要请求 WRITE_EXTERNAL_STORAGE 权限。但 API
级别 18
和更低版本需要此权限。因此,您可以使用如下声明,声明只有 API
级别 18
及以前版本才需要此权限:
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="18" />
这样,从 API
级别 19
开始,系统将不再向您的应用授予WRITE_EXTERNAL_STORAGE
权限。
声明实现应用部分可视化界面的 Activity
(一个 Activity
子类)。必须用清单文件中的 <activity>
元素表示所有 Activity
。系统不会识别和运行任何未进行声明的 Activity
。
实现Activity
的类的名称,是 Activity
的子类。此属性值应为完全限定类名称(例如,“com.example.project.ExtracurricularActivity
)。不过,为简便起见,如果名称的第一个字符是句点(例如,.ExtracurricularActivity
),则名称将追加至<manifest>
元素中指定的软件包名称。一旦发布应用,即不应更改该名称(除非您设置了 android:exported="false"
)。该属性没有默认值。必须指定该名称。
列出Activity
将自行处理的配置变更。在运行时发生配置变更时,默认情况下会关闭 Activity
并将其重启,但使用该属性声明配置将阻止 Activity
重启。相反,Activity
会保持运行状态,并且系统会调用其 onConfigurationChanged()
方法。
有关应如何启动 Activity
的指令。共有四种模式可与 Intent
对象中的Activity
标记(FLAG_ACTIVITY_*
常量)协同工作,以确定在调用 Activity
处理 Intent
时应执行的操作。这些模式是:
默认模式是standard
对定义 Activity
总体主题的样式资源的引用。此属性会自动将Activity
的场景设置为使用该主题(请参阅 setTheme()
),并且还可引发 Activity
启动前的“启动”动画(以更加符合 Activity
的实际外观)。
如果未设置该属性,则 Activity
会继承通过<application>
元素的 theme
属性为应用所整体设置的主题。如果同样未设置该属性,则使用默认系统主题。
Activity
在设备上的显示方向。如果Activity
是在多窗口模式下运行,则系统会忽略该属性。一般为portrait
屏幕方向为纵向(显示的高度大于宽度)。
<intent-filter>
<data android:scheme="tencent101042978"/>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.BROWSABLE"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
指定 Activity
、服务或广播接收器可以响应的 Intent
类型。Intent
过滤器声明其父组件的功能 Activity
或服务可执行哪些操作,以及接收器可处理哪些类型的广播。它让组件可以接收所通告类型的 Intent
,同时过滤掉对组件没有意义的 Intent
。
过滤器的大部分内容由它的<action>
、<category>
和 <data>
子元素进行描述。
将广播接收器(BroadcastReceiver
子类)声明为应用的组件之一。广播接收器允许应用接收由系统或其他应用广播的 Intent,即使应用的其他组件并没有运行也是如此。让系统知道广播接收器有两种方法:一种方法是使用此元素在清单文件中声明广播接收器。另一种方法是在代码中动态创建接收器,并使用 Context.registerReceiver() 方法注册接收器。
广播接收器是否可以接收来自其应用外部来源的消息 。如果可以,则为true
,如果不可以,则为false
。如果为false
,则广播接收器只能接收由同一应用或具有相同用户 ID
的应用的组件发送的消息。
声明内容提供程序组件。内容提供程序是 ContentProvider
的子类,可提供对由应用管理的数据的结构化访问机制。应用中的所有内容提供程序都必须在清单文件的 <provider>
元素中定义;否则,系统将不知道它们,也不会运行它们。
系统是否可以实例化内容提供程序。如果可以,则设为true
;如果不能,则设为false
。默认值为true
。 <application>
元素具有自己的 enabled
属性,该属性适用于所有应用组件,包括内容提供程序。<application>
和 <provider>
属性必须都为true
(这正是它们两者的默认设置),才会启用内容提供程序。如果其中任一属性为false
,就会停用提供程序;无法将其实例化。
将服务(Service
子类)声明为应用的一个组件。与 Activity
不同,服务缺少可视化界面。服务用于实现长时间运行的后台操作,或可由其他应用调用的富通信 API
。必须用清单文件中的 <service>
元素表示所有服务。系统不会识别和运行任何未进行声明的服务。
系统是否可实例化服务 true
表示可以,false
表示不可以。默认值为true
。 <application>
元素拥有自己的 enabled
属性,该属性适用于所有应用组件,包括服务。只有在 <application>
和 <service>
属性都为true
(因为它们都默认使用该值)时,系统才能启用服务。任何一项为“false”都会造成服务停用,从而使系统无法将其实例化。
为应用实现的 Application
子类的完全限定名称。应用进程启动后,此类会在应用的所有组件之前进行实例化。该子类是可选的;大多数应用都不需要它。在没有子类的情况下,Android
会使用 Application
基类的实例。
整个应用的图标,以及每个应用组件的默认图标。
整个应用的用户可读标签,以及每个应用组件的默认标签。
声明您的应用是否愿意支持从右到左 (RTL
) 布局。如果设为 true
并且 targetSdkVersion
设为 17
或更高版本,则系统会激活和使用各种 RTL API
,以便您的应用可以显示 RTL
布局。
如果设为false
或者如果 targetSdkVersion
设为 16
或更低版本,则 RTL API
将被忽略或不起作用,无论与用户所选语言区域关联的布局方向为何(布局始终是从左到右),应用的行为都相同。此属性的默认值为false
对样式资源的引用,用于为应用中的所有Activity
定义默认主题背景。各个Activity
可以通过设置自己的 theme
属性来替换默认值。