在AndroidManifest.xml文件中,首先看到是的节点,它是整个应用程序的基本属性,涵盖了默认进程名字,应用程序标识,安装位置,对系统的要求以及应用程序的版本等。它是AndroidManifest.xml文件的根节点,其中必须包含一个节点,并且必须指定xmlns:android和package属性,其语法如下面的代码所示:

在AndroidManifest.xml文件中,首先看到是的<manifest>节点,它是整个应用程序的基本属性,涵盖了默认进程名字,应用程序标识,安装位置,对系统的要求以及应用程序的版本等。它是AndroidManifest.xml文件的根节点,其中必须包含一个<application>节点,并且必须指定xmlns:android和package属性,其语法如下面的代码所示:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="string"
android:sharedUserId="string"
android:sharedUserLabel="string resource"
android:versionCode="integer"
android:versionName="string"
android:installLocation=["auto"|"internalOnly"|"preferExternal"]>
.............
</manifest>

 

需要注意的是,在上面的描述的众多属性中,除了xmlns和package节点外,其余都是可选节点,Android为它们提供了默认值。接下来,我们就来详细的说明<manifest>节点中这些属性的含义及其作用。

 

1.xmlns:android属性——定义命名空间

 

 

这个属性定义了这个XML文件所使用的命名空间。如果需要指定特殊的命名空间,就需要手动编写代码,基本格式如下:

xmlns:<命名空间标识>="http://schemas.android.com/apk/res/<完整的包名>"

注意:代码中的<>部分必须填写的部分,千万不可遗漏!

 

我们就从万能的HelloWorld开始讲解,打开最新的android开发工具android studio,创建一个名为HelloWorld的项目,项目会自动生成AndroidManifest.xml文件,我们来看看它的结构。

 

 

 

如果“标识”不匹配,产生的结果如下图所示:

 

错误提示:

 

 

“资源所在包名“是一个必须存在的Java包名,如果不存在,同样也会出错。

 

看到了以上图解,大家明白了吧!标识和资源包名等一定要统一,不能随性而写,否则无论怎么折腾都只能原地踏步了。切记!

 

2.package属性——应用程序的身份证

 

package属性唯一标识了一个应用程序。注意,它是唯一的!同样,它也是应用程序进程的默认名字以及应用程序中每个Activity的默认任务(taskAffinity)。通常情况下,当我们完成创建的时候,它就有了默认值。那么,这些默认的名字到底从哪里来的呢?如下图:

 

 

运行此程序,此时Android设备就会为这个应用启动一个这样的进程,如下图:

 

 

看清楚了吗?说到这里,你可能会冒出一个想法:要是我安装另一个有相同package属性的应用程序,会有什么事情发生呢?会提示如下错误:

Failure[INSTALL_FAILED_ALREADY_EXSIST]

 

注意:除非特殊需要,否则不建议修改package属性的值!原因是package是唯一标识了我们应用程序的属性,如果你试图改变它的值,那么系统通常会认为这是一个不同的应用程序,会导致拥有前一版本应用程序的用户无法拥有新版本的应用程序。

 

3.android:sharedUserId属性——共享数据

 

该属性定义了需要和其他应用程序共享的Linux用户ID。默认情况下,Android系统为每一个应用程序分配一个唯一的用户ID。然而,当这个属性在多个应用程序中被设置为相同值的时候,它们将共享一个用户ID。这样做的好处是,它们之间可以相互访问彼此的数据,如有需要,它们还将在相同的进程中运行。Helloworld应用并没有设置这个属性,这就意味着它没有和别的应用程序存在共享关系,这样它们 之间就需要通过其他手段(如进程间通信)实现数据互访。

 

与android:sharedUserId属性相关的属性还有android:sharedUserLabel,这个属性给共享的用户ID定义了一个用户可读的标签。这个标签必须用字符串资源来设置,不能使用原生的字符串。这个属性在API  LEVEL3中引用,只有设置了sharedUserId属性时才有意义。

 

4.android:versionCode属性——内部版本号

 

android:versionCode属性的值是一个内部版本号,用于确定这个版本是否比另一个版本更新,数字越大表明它就越新。它不是显示给用户看的版本号,而是由versionName属性设置的号码。版本号将决定一些服务的行为,比如替换应用程序时是否执行备份还原操作等。

 

该号码必须设为整数,如100。此外,我们可以随心所欲地定义这个整数,只要每个继任的版本能有一个更大的数字即可。例如,它可以是一个编译号码。

 

5.android:versionName属性——显示给用户的版本号

 

android:versionName属性的值是显示给用户的版本号,它可以被设置为一个原始字符串或者一个字符串资源的引用。这个字符串除了要显示给用户外,没有其他的目的。在HelloWorld中,显示给用户的版本号为1.0,如下图:

 

 

6.android:installLocation属性——安装位置

 

该属性定义了应用程序默认的安装位置,共有3个可选值,其形式如下:

android:installLocation=["auto"|"internalOnly"|"preferExternal"]

 

下表说明了这3个可选值的含义。

 

 


描述

auto

应用程序可能被安装到外部存储设备中,但默认情况下系统将会把应用程序安装到内部存储设备中。如果内存不足,那么系统将会把应用程序安装到外部存储设备中。

                                      internalOnly                                              

应用程序必须安装到设备的内部存储设备中。如果设置了这个值,那意味着应用程序将永远不会安装到外部存储设备中去。如果内存不足,那么系统将不会安装这个APK。在没有设置android:installLocation属性的情况下,internalOnly是该属性的默认值。

preferExternal

应用程序将会被安装到外部存储设备中,如果系统不支持外部存储设备或者外部设备已满,那么系统将会把这个应用程序安装到内部存储设备中。