zoukankan      html  css  js  c++  java
  • Android清单文件详解(一) ---- 一切从<manifest>开始

    在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 应用程序将会被安装到外部存储设备中,如果系统不支持外部存储设备或者外部设备已满,那么系统将会把这个应用程序安装到内部存储设备中。
  • 相关阅读:
    English 2
    速算24点
    心理学1
    从微服务到函数式编程
    034 01 Android 零基础入门 01 Java基础语法 04 Java流程控制之选择结构 01 流程控制概述
    033 01 Android 零基础入门 01 Java基础语法 03 Java运算符 13 运算符和表达式知识点总结
    032 01 Android 零基础入门 01 Java基础语法 03 Java运算符 12 运算符和if-else条件语句的综合案例——闰年问题
    031 01 Android 零基础入门 01 Java基础语法 03 Java运算符 11 运算符的优先级
    030 01 Android 零基础入门 01 Java基础语法 03 Java运算符 10 条件运算符
    029 01 Android 零基础入门 01 Java基础语法 03 Java运算符 09 逻辑“非”运算符
  • 原文地址:https://www.cnblogs.com/liyuanjinglyj/p/manifest.html
Copyright © 2011-2022 走看看