Android清单文件详解(一) ---- 一切从<manifest>开始

举报
择城终老 发表于 2021/07/27 01:06:51 2021/07/27
【摘要】 在AndroidManifest.xml文件中,首先看到是的<manifest>节点,它是整个应用程序的基本属性,涵盖了默认进程名字,应用程序标识,安装位置,对系统的要求以及应用程序的版本等。它是AndroidManifest.xml文件的根节点,其中必须包含一个<application>节点,并且必须指定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 应用程序将会被安装到外部存储设备中,如果系统不支持外部存储设备或者外部设备已满,那么系统将会把这个应用程序安装到内部存储设备中。


文章来源: liyuanjinglyj.blog.csdn.net,作者:李元静,版权归原作者所有,如需转载,请联系作者。

原文链接:liyuanjinglyj.blog.csdn.net/article/details/46866521

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。