AndroidManifest.xml 最全详解

原文地址 developer.aliyun.com

AndroidManifest.xml 最全详解

AndroidManifest.xml 是每个 android 程序中必须的文件,它位于整个项目的根目录。我们每天都在使用这个文件,往里面配置程序运行所必要的组件,权限,以及一些相关信息。但是对于这个文件,我们真正又了解多少了,还是只是停留在只会简单的配置,而不明白其中的具体含义,以及为什么要这样设置?今天就让我们来详细的学习一下这个文件里各项参数的具体含义,因为它是整个应用的入口,所以有助于我们更加深入的理解 Android。

目录

一、概述

二、结构图

三、详解

1、Manifest: 属性

2、Application: 属性

3、Activity: 属性

4、meta-data:属性

5、activity-alias:属性

6、Service: 属性

7、Receiver: 属性

8、Provider: 属性

9、uses-library

10、supports-screens

11、uses-configuration 与 uses-feature 性能比较

12、uses-sdk

13、instrumentation

14、permission、uses-permission、permission-tree 、permission-group 区别

四、分享几个常用方法

后面我们将讲解安卓的组件化 SPI,更多教程请关注作者

一、概述

AndroidManifest.xml 文件是整个应用程序的信息描述文件,定义了应用程序中包含的 Activity,Service,Content provider 和 BroadcastReceiver 组件信息。每个应用程序在根目录下必须包含一个 AndroidManifest.xml 文件,且文件名不能修改。它描述了 package 中暴露的组件,他们各自的实现类,各种能被处理的数据和启动位置。

二、结构图

<?xmlversion="1.0"encoding="utf-8"?>
<manifest>
 
    <uses-sdk/> 
    <uses-configuration/> 
    <uses-feature/>  
 
    <uses-permission/>
    <permission/>
    <permission-tree/>
    <permission-group/>
    <instrumentation/> 
 
    <supports-screens/>
 
    <application> 
       <activity> 
           <intent-filter>
               <action/> 
               <category/> 
           </intent-filter> 
      </activity>
       <activity-alias> 
           <intent-filter></intent-filter> 
           <meta-data/> 
      </activity-alias> 
       <service> 
           <intent-filter></intent-filter> 
           <meta-data/> 
       </service>
       <receiver>
           <intent-filter></intent-filter> 
           <meta-data/> 
       </receiver> 
       <provider> 
           <grant-uri-permission/>
           <meta-data/> 
       </provider> 
       <uses-library/> 
    </application>  
 
</manifest>

三、详解

1、Manifest: 属性

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

xmlns:android

定义 android 命名空间,一般为 http://schemas.android.com/apk/res/android,这样使得 Android 中各种标准属性能在文件中使用,提供了大部分元素中的数据。

package

指定本应用内 java 主程序包的包名,它也是一个应用进程的默认名称

sharedUserId

表明数据权限,因为默认情况下,Android 给每个 APK 分配一个唯一的 UserID,所以是默认禁止不同 APK 访问共享数据的。若要共享数据,第一可以采用 Share Preference 方法,第二种就可以采用 sharedUserId 了,将不同 APK 的 sharedUserId 都设为一样,则这些 APK 之间就可以互相共享数据了。

sharedUserLabel

一个共享的用户名,它只有在设置了 sharedUserId 属性的前提下才会有意义

versionCode

是给设备程序识别版本 (升级) 用的必须是一个 interger 值代表 app 更新过多少次,比如第一版一般为 1,之后若要更新版本就设置为 2,3 等等。。。

versionName

这个名称是给用户看的,你可以将你的 APP 版本号设置为 1.1 版,后续更新版本设置为 1.2、2.0 版本等等。。。

installLocation

安装参数,是 Android2.2 中的一个新特性,installLocation 有三个值可以选择:internalOnly、auto、preferExternal

选择 preferExternal, 系统会优先考虑将 APK 安装到 SD 卡上,选择 auto,系统将会根据存储空间自己去适应,选择 internalOnly 是指必须安装到内部才能运行

2、Application: 属性

一个 AndroidManifest.xml 中必须含有一个 Application 标签,这个标签声明了每一个应用程序的组件及其属性 (如 icon,label,permission 等)

<application  android:allowClearUserData=["true" | "false"]
             android:icon="drawable resource"
             android:killAfterRestore=["true" | "false"]
             android:label="string resource"
             android:manageSpaceActivity="string"
             android:
             android:allowTaskReparenting=["true" | "false"]
             android:backupAgent="string"
             android:debuggable=["true" | "false"]
             android:description="string resource"
             android:enabled=["true" | "false"]
             android:hasCode=["true" | "false"]
             android:permission="string"
             android:persistent=["true" | "false"]
             android:process="string"
             android:restoreAnyVersion=["true" | "false"]
             android:taskAffinity="string"
             android:theme="resource or theme" >
</application>

android:allowClearUserData(‘true’ or ‘false’)

用户是否能选择自行清除数据,默认为 true,程序管理器包含一个选择允许用户清除数据。当为 true 时,用户可自己清理用户数据,反之亦然

android:allowTaskReparenting(‘true’ or ‘false’)

是否允许 activity 更换从属的任务,比如从短信息任务切换到浏览器任务

android:backupAgent

这也是 Android2.2 中的一个新特性,设置该 APP 的备份,属性值应该是一个完整的类名,如 com.project.TestCase,此属性并没有默认值,并且类名必须得指定 (就是个备份工具,将数据备份到云端的操作)

android:debuggable

这个从字面上就可以看出是什么作用的,当设置为 true 时,表明该 APP 在手机上可以被调试。默认为 false, 在 false 的情况下调试该 APP,就会报以下错误:

Device XXX requires that applications explicitely declare themselves as debuggable in their manifest.

Application XXX does not have the attribute ‘debuggable’ set to TRUE in its manifest and cannot be debugged.

android:description/android:label

此两个属性都是为许可提供的,均为字符串资源,当用户去看许可列表 (android:label) 或者某个许可的详细信息 (android:description) 时,这些字符串资源就可以显示给用户。label 应当尽量简短,之需要告知用户该许可是在保护什么功能就行。而 description 可以用于具体描述获取该许可的程序可以做哪些事情,实际上让用户可以知道如果他们同意程序获取该权限的话,该程序可以做什么。我们通常用两句话来描述许可,第一句描述该许可,第二句警告用户如果批准该权限会可能有什么不好的事情发生

android:enabled

Android 系统是否能够实例化该应用程序的组件,如果为 true,每个组件的 enabled 属性决定那个组件是否可以被 enabled。如果为 false,它覆盖组件指定的值;所有组件都是 disabled。

android:hasCode(‘true’ or ‘false’)

表示此 APP 是否包含任何的代码,默认为 true,若为 false,则系统在运行组件时,不会去尝试加载任何的 APP 代码

一个应用程序自身不会含有任何的代码,除非内置组件类,比如 Activity 类,此类使用了 AliasActivity 类,当然这是个罕见的现象

(在 Android2.3 可以用标准 C 来开发应用程序,可在 androidManifest.xml 中将此属性设置为 false, 因为这个 APP 本身已经不含有任何的 JAVA 代码了)

android:icon

这个很简单,就是声明整个 APP 的图标,图片一般都放在 drawable 文件夹下

android:killAfterRestore

android:manageSpaceActivity

android:name

为应用程序所实现的 Application 子类的全名。当应用程序进程开始时,该类在所有应用程序组件之前被实例化。

若该类 (比方 androidMain 类) 是在声明的 package 下,则可以直接声明 android:name=”androidMain”, 但此类是在 package 下面的子包的话,就必须声明为全路径或 android:name=”package 名称. 子包名成. androidMain”

android:permission

设置许可名,这个属性若在上定义的话,是一个给应用程序的所有组件设置许可的便捷方式,当然它是被各组件设置的许可名所覆盖的

android:presistent

该应用程序是否应该在任何时候都保持运行状态, 默认为 false。因为应用程序通常不应该设置本标识,持续模式仅仅应该设置给某些系统应用程序才是有意义的。

android:process

应用程序运行的进程名,它的默认值为元素里设置的包名,当然每个组件都可以通过设置该属性来覆盖默认值。如果你想两个应用程序共用一个进程的话,你可以设置他们的 android:process 相同,但前提条件是他们共享一个用户 ID 及被赋予了相同证书的时候

android:restoreAnyVersion

同样也是 android2.2 的一个新特性,用来表明应用是否准备尝试恢复所有的备份,甚至该备份是比当前设备上更要新的版本,默认是 false

android:taskAffinity

拥有相同的 affinity 的 Activity 理论上属于相同的 Task,应用程序默认的 affinity 的名字是元素中设定的 package 名

android:theme

是一个资源的风格,它定义了一个默认的主题风格给所有的 activity, 当然也可以在自己的 theme 里面去设置它,有点类似 style。

3、Activity: 属性

 
<activity android:allowTaskReparenting=["true" | "false"]
          android:alwaysRetainTaskState=["true" | "false"]
          android:clearTaskOnLaunch=["true" | "false"]
          android:configChanges=["mcc", "mnc", "locale",
                                 "touchscreen", "keyboard", "keyboardHidden",
                                 "navigation", "orientation", "screenLayout",
                                 "fontScale", "uiMode"]
          android:enabled=["true" | "false"]
          android:excludeFromRecents=["true" | "false"]
          android:exported=["true" | "false"]
          android:finishOnTaskLaunch=["true" | "false"]
          android:icon="drawable resource"
          android:label="string resource"
          android:launchMode=["multiple" | "singleTop" |
                              "singleTask" | "singleInstance"]
          android:multiprocess=["true" | "false"]
          android:
          android:noHistory=["true" | "false"]  
          android:permission="string"
          android:process="string"
          android:screenOrientation=["unspecified" | "user" | "behind" |
                                     "landscape" | "portrait" |
                                     "sensor" | "nosensor"]
          android:stateNotNeeded=["true" | "false"]
          android:taskAffinity="string"
          android:theme="resource or theme"
          android:windowSoftInputMode=["stateUnspecified",
                                       "stateUnchanged", "stateHidden",
                                       "stateAlwaysHidden", "stateVisible",
                                       "stateAlwaysVisible", "adjustUnspecified",
                                       "adjustResize", "adjustPan"] >   
</activity>

android:alwaysRetainTaskState

是否保留状态不变, 比如切换回 home, 再从新打开,activity 处于最后的状态。比如一个浏览器拥有很多状态 (当打开了多个 TAB 的时候),用户并不希望丢失这些状态时,此时可将此属性设置为 true

android:clearTaskOnLaunch

比如 P 是 activity, Q 是被 P 触发的 activity, 然后返回 Home, 重新启动 P,是否显示 Q

android:configChanges

当配置 list 发生修改时, 是否调用 onConfigurationChanged() 方法 比如 “locale|navigation|orientation”.

这个我用过, 主要用来看手机方向改变的. android 手机在旋转后, layout 会重新布局, 如何做到呢?

正常情况下. 如果手机旋转了. 当前 Activity 后杀掉, 然后根据方向重新加载这个 Activity. 就会从 onCreate 开始重新加载.

如果你设置了 这个选项, 当手机旋转后, 当前 Activity 之后调用 onConfigurationChanged() 方法. 而不跑 onCreate 方法等.

android:excludeFromRecents

是否可被显示在最近打开的 activity 列表里,默认是 false

android:finishOnTaskLaunch

当用户重新启动这个任务的时候,是否关闭已打开的 activity,默认是 false

如果这个属性和 allowTaskReparenting 都是 true, 这个属性就是王牌。Activity 的亲和力将被忽略。该 Activity 已经被摧毁并非 re-parented

android:launchMode(Activity 加载模式)

在多 Activity 开发中,有可能是自己应用之间的 Activity 跳转,或者夹带其他应用的可复用 Activity。可能会希望跳转到原来某个 Activity 实例,而不是产生大量重复的 Activity。这需要为 Activity 配置特定的加载模式,而不是使用默认的加载模式

Activity 有四种加载模式:

standard、singleTop、singleTask、singleInstance(其中前两个是一组、后两个是一组),默认为 standard

standard:就是 intent 将发送给新的实例,所以每次跳转都会生成新的 activity。

singleTop:也是发送新的实例,但不同 standard 的一点是,在请求的 Activity 正好位于栈顶时 (配置成 singleTop 的 Activity),不会构造新的实例

singleTask:和后面的 singleInstance 都只创建一个实例,当 intent 到来,需要创建设置为 singleTask 的 Activity 的时候,系统会检查栈里面是否已经有该 Activity 的实例。如果有直接将 intent 发送给它。

singleInstance:

首先说明一下 task 这个概念,Task 可以认为是一个栈,可放入多个 Activity。比如启动一个应用,那么 Android 就创建了一个 Task,然后启动这个应用的入口 Activity,那在它的界面上调用其他的 Activity 也只是在这个 task 里面。那如果在多个 task 中共享一个 Activity 的话怎么办呢。举个例来说,如果开启一个导游服务类的应用程序,里面有个 Activity 是开启 GOOGLE 地图的,当按下 home 键退回到主菜单又启动 GOOGLE 地图的应用时,显示的就是刚才的地图,实际上是同一个 Activity,实际上这就引入了 singleInstance。singleInstance 模式就是将该 Activity 单独放入一个栈中,这样这个栈中只有这一个 Activity,不同应用的 intent 都由这个 Activity 接收和展示,这样就做到了共享。当然前提是这些应用都没有被销毁,所以刚才是按下的 HOME 键,如果按下了返回键,则无效

android:multiprocess

是否允许多进程,默认是 false

android:noHistory

当用户从 Activity 上离开并且它在屏幕上不再可见时,Activity 是否从 Activity stack 中清除并结束。默认是 false。Activity 不会留下历史痕迹

android:screenOrientation

activity 显示的模式

默认为 unspecified:由系统自动判断显示方向

landscape 横屏模式,宽度比高度大

portrait 竖屏模式, 高度比宽度大

user 模式,用户当前首选的方向

behind 模式:和该 Activity 下面的那个 Activity 的方向一致 (在 Activity 堆栈中的)

sensor 模式:有物理的感应器来决定。如果用户旋转设备这屏幕会横竖屏切换

nosensor 模式:忽略物理感应器,这样就不会随着用户旋转设备而更改了

android:stateNotNeeded

activity 被销毁或者成功重启时是否保存状态

android:windowSoftInputMode

activity 主窗口与软键盘的交互模式,可以用来避免输入法面板遮挡问题,Android1.5 后的一个新特性。

这个属性能影响两件事情:

【A】当有焦点产生时,软键盘是隐藏还是显示

【B】是否减少活动主窗口大小以便腾出空间放软键盘

各值的含义:

【A】stateUnspecified:软键盘的状态并没有指定,系统将选择一个合适的状态或依赖于主题的设置

【B】stateUnchanged:当这个 activity 出现时,软键盘将一直保持在上一个 activity 里的状态,无论是隐藏还是显示

【C】stateHidden:用户选择 activity 时,软键盘总是被隐藏

【D】stateAlwaysHidden:当该 Activity 主窗口获取焦点时,软键盘也总是被隐藏的

【E】stateVisible:软键盘通常是可见的

【F】stateAlwaysVisible:用户选择 activity 时,软键盘总是显示的状态

【G】adjustUnspecified:默认设置,通常由系统自行决定是隐藏还是显示

【H】adjustResize:该 Activity 总是调整屏幕的大小以便留出软键盘的空间

【I】adjustPan:当前窗口的内容将自动移动以便当前焦点从不被键盘覆盖和用户能总是看到输入内容的部分

posted @ 2023-03-30 11:28  cps666  阅读(466)  评论(0编辑  收藏  举报