AndroidManifest.xml是应用清单文件,manifest翻译是货单的意思。每个应用得根目录中都必须包含一个AnroidManifest.xml文件,其中包含APP得配置信息,系统需要根据配置内容运行APP代码并显示界面。
AndroidManifest.xml文件是Android应用程序的全局配置文件,是每个Android应用程序中必备的文件。位于开发应用程序的个呢目录下,描述了package
包中的全局参数,包括package
中暴露的组件,以及各自的实现类,各种能被处理的数据和启动位置等重要信息。因此,该文件提供了Android系统所需的关于该应用程序的必要信息,即在该应用程序的任何代码运行之前系统所必须拥有的信息。
AndroidManifest.xml文件的具体作用是什么呢?
- 为应用的Java软件包命名,软件包名称充当应用的唯一标识符。
- 描述应用各个组件,包括构成应用的活动、服务、广播接收器、内容提供者。为实现每个组件的类命名并发布其功能。
- 确定托管应用组件的进程
- 声明应用必须具备的权限才能访问API受保护部分并于其他应用交互
- 声明其他应用与该应用组件交互所需的权限
- 列出
Instrumentation
类,在应用运行时提供分析和其他信息。此声明只会在应用处于开发阶段时出现在清单中,在应用发布之前会将其移除。 - 声明应用所需的最低AndroidAPI级别
- 列出应用必须链接到的库
AndroidManifest.xml 标记分析
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.weihuagu.receiptnotice">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<application
android:name=".MainApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.AppCompat.Light.NoActionBar">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".FileLogActivity" android:label="@string/filelog_title">
<intent-filter >
<action android:name="com.weihuagu.receiptnotice.showfilelog"/>
</intent-filter>
</activity>
<activity android:name=".IllustrateDecryptActivity" android:label="@string/illustratedecrypt_title">
<intent-filter>
<action android:name="com.weihuagu.receiptnotice.illustratedecryptmethod"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
<activity android:name="com.github.pedrovgs.lynx.LynxActivity"/>
<activity android:name=".PreferenceActivity"/>
<service android:name=".NLService" android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE">
<intent-filter>
<action android:name="android.service.notification.NotificationListenerService" />
</intent-filter>
</service>
<service android:name=".NotificationCollectorMonitorService"/>
</application>
</manifest>
<manifest> 元素
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.sample.test"
android:versionCode="1"
android:versionName="1.0.0.1" >
</manifest>
所有XML都必须包含<manifest>
元素,它是文件的根节点,必须包含<application>
元素,并需要指明xmlns:android
和package
属性。
<manifest> 属性
xmlns:androrid 用于定义Android命名空间,必须设置成 http://schemas.android.com/apk/res/android 无需手动修改。
package 定义完整的Java语言风格包名,包名由英文字母(大小写均可)、数字、下划线组成,每个独立的名字必须以字母开通头。
在构建APK时构建系统使用xmls:android
和package
两个属性来做两件事儿:
- 使用
package
名字作为生成R.java
类时的命名空间,用于访问APP的资源。
比如package:com.sample.test
生成的R类为com.sample.test.R
。 - 使用
package
生成在manifest
文件中定义的类的完整类名
比如package:com.sample.test
当activity
元素被声明为<activity android:name=".MainActivity">
,此时完整的类名就时com.sample.test.MainActivity
。
package
包名代表了唯一的application ID
,可以 用来发布应用。需要注意的是在APK构建过程的最后一步,package
包名会被build.gradle
文件中的applicationId
属性取待。如果这两个属性值一样就表示构建成功。
- android:versionCode 用于设置Android内部版本号,用来表明哪个版本更新,此数字不会显示给用户,显示给用户的是
versionName
,此是数字必须是整数不能使用十六进制。 - anroid:versionName 用于设置显示给用户的版本号
<users-feature> 元素
<uses-feature android:glEsVersion="0x00020000"></uses-feature>
Google Play会利用<uses-feature>
元素的值从不符合应用需要的设备上将应用过滤,<uses-feature>
元素的作用是将APP所依赖的硬件或软件告诉别人,用来说明APP的那些功能可以随设备的变化而变化。
使用<uses-feature>
需要注意的是必须在单独的<uses-feature>
元素中指定每个功能,如果要多个功能,就需要多个<uses-feature>
元素。
比如要求设备同时具有蓝牙和相机功能
<uses-feature android:name="android.hardware.bluetooth" />
<uses-feature android:name="android.hardware.camera" />
<users-feature> 属性
- android:name 以字符串形式在指定APP所要是使用的硬件或软件功能
- android:required 表示是否功能是否是应用必须的,为
true
表示必须具有否则应用无法工作,为false
表示应用在没有此功能时也能工作。 - android:glEsVersion 指定应用所需的OpenGL ES版本,其中高16位表示主版本号,低16位表示次版本号。若定义多个则会自动启动最高配置。
<application> 元素
<application
android:allowBackup="false"
android:fullBackupContent="false"
android:supportsRtl="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme"
android:name="com.sample.test.TestApplication"
></application>
<application>
元素描述了应用的配置,是一个必备元素,包含很多子元素用来描述应用的组件,其属性影响到所有子组件。
<application> 属性
- android:allowBackup 表示是否允许APP加入到备份还原的结构中,若设置为
false
则应用不会备份还原,默认为true
。 - android:fullBackupContent 属性会指向一个XML文件,XML文件中包含了进行自动备份时的完全备份规则,规则定了哪些文件需要备份。此属性是一个可选属性,默认情况下自动备份包含了大部分APP文件。
- android:supportsRtl 声明APP是否支持RTL(Right To Left)布局,若设置为
true
且targetSdkVersion
被设置为17或更高,很多RTL API会被激活,这样APP就可以以显示RTL布局。若设置为false
或targetSdkVersion
设置为16或更低则RTL布局就无法生效。默认值为false
。 - android:icon 用于指定APP的图标以及每个组件的默认图标。可以在组件中进行自定义,该属性必须设置成一个引用,执行一个可绘制的资源,资源必须包含图片。
- android:label 用于指定用户可读的标签以及所有组件的默认组件,子组件可以使用它定义自己的标签,若没有定义则使用它。标签必须设置为一个字符串资源的引用,这样就能和其他东西一样被定位。为了开发方便也可以定义为一个原始字符串。
- android:theme 用于定义APP使用的主题,是一个指向
style
资源的引用。各个activity
也可以设置自己的theme
属性。 - android:name 用于设置
Application
子类的全名,当APP启动时这个类会被第一个创建。
<activity> 元素
<activity
android:name="com.sample.test.TeapotNativeActivity"
android:label="@string/app_name"
android:configChanges="orientation|keyboardHidden"
>
<activity>
元素用于声明一个实现APP可视化界面的Activity
类子类,是<application>
元素中必备的子元素。所有Activity
都必须由AndroidManifest.xml
清单文件中的<activity>
元素表示,任何未在该处声明的Activity
对系统都不可见,而且永远不会被执行。
<activity> 属性
- android:name 用于指定Activity类的名称,是Activity类的子类,为完全限定类名称。为方便起见,若第一个字符是点
.
在需要加上<manifest>
元素中的package
包名。APP一旦发布不应该更改此名称。注意的是它是没有默认值的,必须指定该名称。 - android:label 用于指定Activity标签,可以被用户读取。标签会在Activity
激活时显示在屏幕上,如果没有设置会使用<application>
中的label
属性,设置要求和<application>
保持一致。 - android:configChanges 用于列出Activity将自行处理的配置更新消息,在运行时发生配置更改时,默认会关闭Activity然后将其重新启动,但使用该属性声明配置将会阻止Activity重新启动。Activity反而会保持运行状态,并且系统会调用其
onConfigurationChanged()
方法。需要注意的是,应该避免使用此配置,只有在万不得已的情况下年使用。 - android:theme 用于设定主题格式,与
<application>
中的theme
类似。
<meta-data> 元素
<meta-data android:name="android.app.lib_name" android:value="TestNativeActivity" />
<meta-data>
元素 用于指定额外的数据项,该数据项是一个name-value
的键值对,提供给父组件。键值对数据会组成一个Bundle对象,由PackageItemInfo.metaData
字段使用。虽然可以使用多个<meta-data>
元素标签,但并不推荐。如果有多个数据项需要指定,推荐的做法是将 多个数据项合并成有一个资源,然后使用一个<meta-data>
包含进去。
<meta-data> 属性
- android:name 用于指定数据项名称,是一个唯一值。
- android:resource 用于指定资源的引用
- android:value 用于指定数据项的值
<intent-filter> 元素
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
元素 用于指定Activity可以以什么样的意图(intent)启动
<intent-filter> 子元素
<action> 元素
表示Activity作为一个什么动作启动,android.intent.action.MAIN
表示作为主Activity启动。
<category> 元素
表示Activity元素的额外类别信息,android.intent.categoryr.LAUNCHER
表示Activity为当前应用程序优先级最高的Activity。