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 应用程序将会被安装到外部存储设备中,如果系统不支持外部存储设备或者外部设备已满,那么系统将会把这个应用程序安装到内部存储设备中。
  • 相关阅读:
    javap,是 java printer 的缩写,是 JDK 自带的 Java 字节码分析工具
    这段代码的返回值在出现异常和不出现异常的情况下,分别应该是多少?
    strictfp 关键字修饰方法,即 strict float point (精确浮点)
    transient 修饰符修饰属性:不需要序列化的属性
    Java 中的 CAS 操作
    ReentrantLock 与 synchronized 的比较
    线程安全的实现方法:互斥同步、非阻塞同步、无同步方案
    J.U.C包的意义
    synchronized 原理
    什么场景下,使用 final、volatile、Atomic原子类、synchronized、J.U.C 包中的锁?
  • 原文地址:https://www.cnblogs.com/liyuanjinglyj/p/manifest.html
Copyright © 2011-2022 走看看