AndroidManifest.xml文件详解

来源:互联网 发布:白敬亭 贝尔冒险 知乎 编辑:程序博客网 时间:2024/05/01 21:58

http://greatverve.cnblogs.com/archive/2012/05/08/AndroidManifest-xml.html


AndroidManifest.xml文件详解(一)

每个应用程序在它的根目录中都必须要有一个AndroidManifest.xml文件。这个清单把应用程序的基本信息提交给Android系统,在应用程序的代码能够运行之前,这个信息系统必须建立。以下是清单文件要做的一些事情:

1. 用Java包给应用程序命名。这个包名是应用程序的唯一标识;

2. 描述应用程序的组件---组成应用程序的ActivityServiceBroadcast Receiver以及Content Provider。它要用每个组件的实现类来命名,并向外发布对应组件功能(例如,组件所能处理的Intent消息)。这些声明会让Android系统了解应用程序中组件,以及这些组件被加载的条件。

3. 判断哪些进程是主应用程序组件。

4. 声明应用程序所必须的权限,以便能够访问被保护的API,以及能够跟其他应用程序进行交互。

5. 为了跟应用程序组件进行交互,还声明了其他要求有的权限。

6. 列出了能够提供应用程序运行时的分析和其他信息的Instrumentation类。只有在开发和测试应用程序时才在清单文件中声明这些类,在应用程序被发布之前,要删除这些类。

7. 声明应用程序所要求的最小的Android API级别。

8. 列出应用程序必须链接的外部库。

Manifest文件的结构

下图中包含了清单文件的一般性结构,并且包含所有能包含的元素。每个元素所带有的全部元素会在它们各自的文档中介绍。

<?xml version="1.0" encoding="utf-8"?>
<manifest>
    
<uses-permission/>
    
<permission/>
    
<permission-tree/>
    
<permission-group/>
    
<instrumentation/>
    
<uses-sdk/>
    
<uses-configuration/>  
    
<uses-feature/>  
    
<supports-screens/>  
    
<compatible-screens/>  
    
<supports-gl-texture/>  
    
<application>
        
<activity>
            
<intent-filter>
                
<action/>
                
<category/>
                
<data/>
            
</intent-filter>
            
<meta-data/>
        
</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>

以下按字母顺序列出了清单文件中的所有元素,这些元素时Android系统法定元素,不能添加自定义的元素或属性。

<action> 
<activity>
 
<activity-alias>
 
<application>
 
<category>
 
<data>
 
<grant-uri-permission>
 
<instrumentation>
 
<intent-filter>
 
<manifest>
 
<meta-data>
 
<permission>
 
<permission-group>
 
<permission-tree>
 
<provider>
 
<receiver>
 
<service>
 
<supports-screens>
 
<uses-configuration>
 
<uses-feature>
 
<uses-library>
 
<uses-permission>
 
<uses-sdk>

AndroidManifest.xml文件详解(二)

文件约定

某些约定和规则普遍适用于清单中的所有元素和属性:

元素

只用<manifest><application>元素时必须的,而且这两个元素在文件中只能出现一次。其他元素则可以多次出现在清单中,或者根本就不出现---但是为了构建一个有意义的清单,必须要在清单中声明某些元素。

一个元素所包含的任何声明,包括它所包含的其他元素,所有的值都是通过属性来设置的,而不是用夹在开闭元素之间的字符数据。

相同级别的元素通常是没有顺序的。例如,<activity><provider><service>元素可以是任意顺序的。(<activity-alias>元素是个例外,它必须放在它所代表的<activity>元素的后面。)

属性

在正式的含义中,所有的属性都是可选的,但是,为了达成目的,必须要给元素指定一些属性。对于真正的可选属性,会指定发生在特殊情况下的默认值或状态。

除了<manifest>根元素的一些属性之外,其他所有属性的命名都带有android:前缀---例如,android:alwaysRetainTaskState。因为这个前缀是通用的,所以本文档在提到属性名时,通常会忽略这个前缀。

声明类名称

许多元素都对应着Java对象,包括代表应用程序自己的元素<application>,以及基本的组件---<activity><service><receiver><provider>等。

如果要定义子类,那么这些子类几乎总是继承以下组件类:ActivityServiceBroadcastReceiverContentProvider。子类是通过name属性来声明的。这个名称必须是完整Java包名。例如,下例演示了Service子类的声明方法:

<manifest . . . >
    
<application . . . >
        
<service android:name="com.example.project.SecretService" . . . >
            . . .

        </service>
        . . .

    </application>
</manifest>

但是,也可以使用简略的表达方式,用”.”符号做为name属性值的第一个字符。在Android系统解析是会在”.”符号前追加包名(包名是在<manifest>元素的package属性中声明的)。下例的声明方法与上例的结果相同:

<manifest package="com.example.project" . . . >
    
<application . . . >
        
<service android:name=".SecretService" . . . >
            . . .

        </service>
        . . .

    </application>
</manifest>

在启动组件时,Android会创建这个命名子类的一个实例对象。如果没有指定子类,那么就会创建一个基类的实例对象。

多个值的设定

如果要给一个元素指定多个值,那么几乎总是重复使用这个元素,而不是在一个元素中列出多个值。如:

<intent-filter . . . >
    
<actionandroid:name="android.intent.action.EDIT"/>
    
<actionandroid:name="android.intent.action.INSERT"/>
    
<actionandroid:name="android.intent.action.DELETE"/>
    . . .
</intent-filter>

资源值的设定

有一些属性值是能够显示给用户的---例如,Activity的标题和图标。这些属性值应该被本地化,并因此要设置在资源或主题中。资源值是用下列格式来表示的:@[package:]type:name

如果资源与应用在同一个包中,那么package的名称可以被忽略,type是资源的类型---如“string”或“drawable”,name是标识指定资源的名称。例如:

<activity android:icon="@drawable/smallPic" . . . >

来自主题的值是用类似的方式来表示的,但是要以‘?’开始,而不是‘@’:

?[package:]type:name

String值的设定

当属性值是一个字符串是,‘\\’符号要用于字符转义---如‘\\n’表示在此处换行,‘\\uxxxx’表示‘xxxx’是Unicode字符。

AndroidManifest.xml文件详解(三)

文件功能

以下章节介绍清单文件是如何反映Android的某些功能的。

Intent过滤器

应用程序的核心组件(ActivityServiceBroadcast Receiver)都是通过Intent对象来激活的。Intent对象绑定了所期望的操作的信息说明---包括要操作的数据、执行操作的组件类别、以及其他相关的指令。Android会定位一个合适的组件来响应Intent对象的请求,如果需要它启动这个组件的一个新的实例,并且把Intent对象传递给这个实例。

组件通过Intent过滤器来公布它们所具有的能力---组件所能响应的Intent对象的类型。因此Android系统在启动组件之前,必须了解组件能够处理那些Intent对象,Intent过滤器要在清单文件的<intent-filter>元素中指定。

明确命名目标组件的Intent对象,会激活那个组件,过滤器并不扮演一个角色,但是如果没有指定目标组件名称的Intent对象要想激活一个组件,那么它必须能够通过这个组件的一个过滤器来传递。

图标和标题

许多元素有iconlabel属性,这两个属性能够声明显示给用户的小图标和文本标签。还有一些属性有description属性,这个属性值用于在屏幕上显示一些比较长的解释性的文本。例如<permission>元素就有这三个属性,这样在用户询问是否授予应用程序所请求权限时,就可以用一个icon代表权限、label代表权限名称、description来详细说明权限的内容,并把这些信息展示给用户。

在任何情况下,在容器型元素中设置的iconlabel都会成为它所包含的所有子元素的默认的iconlabel设置。这样,在<application>元素中设置的iconlabel属性值就会成为每个应用程序组件的默认iconlabel值。针对一个组件的iconlabel设置也会有同样的效果---例如,一个<activity>元素中设置的iconlabel属性值,会成这个<activity>中每个<intent-filter>元素的默认设置。如果<application>元素设置了一个label属性,但是<activity>元素以及它的<intent-filter>都没有设置这个属性,那么这个<application>元素的label属性值会作为<activity><intent-filter>元素的label属性的默认值。

Intent过滤器设置的iconlabel属性被用于代表一个组件,不管什么时候,过滤器都会用这两个属性来向用户展示组件所能满足的功能。例如,带有android.intent.action.MAINandroid.intent.category.LAUNCHER操作的一个过滤器,会把对应的Activity做应用程序的启动界面来处理,也就是说,它应该作为Android应用程序启动器中一个应用程序来显示,因此这个过滤器中的iconlabel的属性设置应该显示在Launcher中。

权限

permission是一种约束,它限制了对设备上的数据或部分代码的访问。施加权限是为了保护关键的数据和代码不被滥用,防止给用户带来不好的用户体验。

每种权限都会有一个唯一的标签来标识。通常,标签指明了要约束的操作。例如:

android.permission.CALL_EMERGENCY_NUMBERS 
android.permission.READ_OWNER_DATA
 
android.permission.SET_WALLPAPER
 
android.permission.DEVICE_POWER

一个功能能够通过多个权限来施加保护。

如果应用程序需要访问一个被权限保护的功能,那么它必须在清单文件中用<uses-permission>元素来声明其要求的权限。然后,在应用程序被安装到设备上时,Android安装器会通过检查应用程序的数字证书,以及询问用户,来确定是否要授予应用程序所请求的权限。如果权限请求被接受,那么应用程序就能够使用被保护的功能,否则,在试图访问那些受保护的功能时就会失败,而且不会给用户任何提示。

应用程序也可以有保护它自己的组件(ActivityServiceBroadcast ReceiverContent Provider)。通常可以利用Android系统中定义的权限(在android.Manifest.permission类中列出的权限),也可以利用其它应用程序声明的权限,还可以定义自己的权限。用<permission>元素来声明一个新的权限。例如,一个Activity可以通过下列方法来保护:

<manifest . . . >
    
<permissionandroid:name="com.example.project.DEBIT_ACCT" . . . />
    
<uses-permissionandroid:name="com.example.project.DEBIT_ACCT"/>
    . . .
    
<application . . .>
        
<activityandroid:name="com.example.project.FreneticActivity"
                  
android:permission="com.example.project.DEBIT_ACCT"
                  . . . 
>
            . . .
        
</activity>
    
</application>
</manifest>

要注意的是,在这个例子中,不仅使用<permission>元素声明了一个DEBIT_ACCT权限,而且还用<uses-permission>元素申请了一个DEBIT_ACCT权限。为了让应用程序的其他组件能够启动这个被保护的Activity,即使这种保护是应用程序自己施加的,也必须要这样申请。

在同一个例子中,如果permission属性设置了另外一种权限(如android:permission.CALL_EMERGENCY_NUMBERS),那么就没有必要再用<permission>元素来声明它了。但是依然有必要使用<uses-permission>元素来进行必要的申请。

<permission-tree>元素为一组在代码中定义的权限声明了一个命名空间,并且<permission-group>元素为这个权限组定义了一个标签,这个标签在向用户展示权限时,只会影响到权限的分组。<permission-group>元素没有指定哪个权限属于该组,它只是给出了一个组名。一个权限通过比较<permission>元素的permissionGroup属性值来确定其分组。

外部类库

每个应用程序都会链接默认的Android类库,包括构建程序的基本程序包(如,ActivityServiceIntentViewButtonApplicationContentProvider等等)。

但是,有些包会驻留在它们自己的类库中,如果应用要使用这些包中的代码,就必须明确的要求链接这些类库。对于每个要链接的类库,清单文件中必须包含单独的<uses-library>元素。

AndroidManifest.xml文件详解(action)

语法(SYNATX):

<actionandroid:name="string"/>

包含于(CONTAINED IN):

<intent-filter>

说明(DESCRIPTION):

Intent过滤器添加一个操作。一个<intent-filter>元素必须包含一个或多个<action>元素,如果一个也没有包含,那么就不会有Intent对象通过过滤器。

属性(ATTRIBUTES):

android:name

它定义了操作的名称。在Intent类中用ACTION_string常量定义一些标准的操作。要把这些操作跟这个属性关联,就要把前置的ACTION_字符串换成“android.intent.action.”。例如,对于ACTION_MAIN操作,要使用android.intent.action.MAIN来作为属性值,对于ACTION_WEB_SEARCH操作,要使用android.intent.action.WEB_SEATCH来作为属性值。

对于自定义的操作,最好使用包名来作为前缀,以确保唯一性。例如,TRANSMOGRIFY操作可以像下例这样定义:

<actionandroid:name="com.example.project.TRANSMOGRIFY"/>

引入版本(INTRODUCED IN):

API级别 1

AndroidManifest.xml文件详解(activity)(一)

语法(SYNATX):

<activityandroid:allowTaskReparenting=["true" | "false"]
          
android:alwaysRetainTaskState=["true" | "false"
]
          
android:clearTaskOnLaunch=["true" | "false"
]
          
android:configChanges=["mcc""mnc""locale"
,
                                 
"touchscreen""keyboard""keyboardHidden"
,
                                 
"navigation""screenLayout""fontScale""uiMode"
,
                                 
"orientation""screenSize""smallestScreenSize"
]
          
android:enabled=["true" | "false"
]
          
android:excludeFromRecents=["true" | "false"
]
          
android:exported=["true" | "false"
]
          
android:finishOnTaskLaunch=["true" | "false"
]
          
android:hardwareAccelerated=["true" | "false"
]
          
android:icon="drawable resource"

          
android:label="string resource"
          
android:launchMode=["multiple" | "singleTop" |
                              
"singleTask" | "singleInstance"
]
          
android:multiprocess=["true" | "false"
]
          
android:name="string"

          
android:noHistory=["true" | "false"]  
          
android:permission="string"

          
android:process="string"
          
android:screenOrientation=["unspecified" | "user" | "behind" |
                                     
"landscape" | "portrait"
 |
                                     
"reverseLandscape" | "reversePortrait"
 |
                                     
"sensorLandscape" | "sensorPortrait"
 |
                                     
"sensor" | "fullSensor" | "nosensor"
]
          
android:stateNotNeeded=["true" | "false"
]
          
android:taskAffinity="string"

          
android:theme="resource or theme"
          
android:uiOptions=["none" | "splitActionBarWhenNarrow"]
          
android:windowSoftInputMode=["stateUnspecified"
,
                                       
"stateUnchanged""stateHidden"
,
                                       
"stateAlwaysHidden""stateVisible"
,
                                       
"stateAlwaysVisible""adjustUnspecified"
,
                                       
"adjustResize""adjustPan">
   
    . . .
</activity>

 

包含于(CONTAINED IN):

<application>

能够包含的元素(CAN CONTAIN):

<intent-filter>

<meta-data>

说明(DESCRIPTION):

这个元素声明了一个Activity(或Activity的子类),Activity实现了应用程序的可视化用户界面部分。应用程序中所有的Activity都必须在清单文件中用<activity>元素来声明,没有在清单文件中声明的Activity,系统不会看到,也不会运行它。

属性(ATTRIBUTES):

android:allowTaskReparenting

这个属性用于设定Activity能够从启动它的任务中转移到另一个与启动它的任务有亲缘关系的任务中,转移时机是在这个有亲缘关系的任务被带到前台的时候。如果设置了true,则能够转移,如果设置了false,则这个Activity必须要保留在启动它的那个任务中。

如果这个属性没有设置,那么其对应的<application>元素的allowTaskReparenting属性值就会应用到这个Activity上。它的默认值是false

通常,当Activity被启动时,它会跟启动它的任务关联,并它的整个生命周期都会保持在那个任务中。但是当Activity的当前任务不在显示时,可以使用这个属性来强制Activity转移到与当前任务有亲缘关系的任务中。这种情况的典型应用是把应用程序的Activity转移到与这个应用程序相关联的主任务中。

例如,如果一个电子邮件消息中包含了一个网页的链接,点击这个链接会启动一个显示这个网页的Activity。但是,由e-mail任务部分启动的这个Activity是由浏览器应用程序定义的。如果把它放到浏览器的任务中,那么在浏览器下次启动到前台时,这个网页会被显示,并且在e-mail任务再次显示时,这个Activity有会消失。

Activity的亲缘关系是由taskAffinity属性定义的。通过读取任务的根Activity的亲缘关系来判断任务的亲缘关系。因此,通过定义,任务中的根Activity与任务有着相同的亲缘关系。因此带有singleTasksingleInstance启动模式的Activity只能是任务的根节点,Activity的任务归属受限于standardsingleTop模式。

android:alwaysRetainTaskState

这个属性用于设置Activity所属的任务状态是否始终由系统来维护。如果设置为true,则由系统来维护状态,设置为false,那么在某些情况下,系统会允许重设任务的初始状态。默认值是false。这个属性只对任务根节点的Activity有意义,其他所有的Activity都会被忽略。

通常,在某些情况中,当用户从主屏中重新启动一个任务时,系统会先清除任务(从堆栈中删除根节点Activity之上的所有Activity)。

但是,当这个属性被设置为true时,用户会始终返回到这个任务的最后状态,而不管中间经历了哪些操作。这样做是有好处的,例如,Web浏览器的应用就会保留很多用户不想丢失的状态,如多个被打开的标签页。

android:clearTaskOnLaunch

这个属性用于设定在从主屏中重启任务时,处理根节点的Activity以外,任务中的其他所有的Activity是否要被删除。如果设置为true,那么任务根节点的Activity之上的所有Activity都要被清除,如果设置了false,就不会被清除。默认设置时false。这个属性只对启动新任务(或根Activity)的那些Activity有意义,任务中其他所有的Activity都会被忽略。

当这个属性值被设置为true,用户再次启动任务时,任务根节点的Activity就会被显示,而不管在任务的最后做了什么,也不管任务使用Back按钮,还是使用Home离开的。当这个属性被设置为false时,在某些情况中这个任务的Activity可以被清除,但不总是这样的。

例如,假设某人从主屏中启动了Activity P,并且又从P中启动了Activity Q。接下来用户按下了Home按钮,然后由返回到Activity P。通常用户会看到Activity Q,因为这是在P的任务中所做的最后的事情。但是,如果P把这个属性设置为true,那么在用户按下Home按钮,任务被挂起时,Activity P之上的所有Activity(本例中是Activity Q)都会被删除。因此当用户再次返回到本任务时,用户只能看到Activity P

如果这个属性和allowTaskReparenting属性都被设置为true,那些被设置了亲缘关系的Activity会被转移到它们共享的亲缘任务中,然后把剩下的Activity都给删除。
url:
http://greatverve.cnblogs.com/archive/2012/05/08/AndroidManifest-xml.html

AndroidManifest.xml文件综合详解

一,重要性

AndroidManifest.xml是Android应用程序中最重要的文件之一。它是Android程序的全局配置文件,是每个android程序中必须的文件。它位于我们开发的应用程序的根目录下,描述了package中的全局数据,包括package中暴露的组件(activities, services, 等等),以及他们各自的实现类,各种能被处理的数据和启动位置等重要信息。 
因此,该文件提供了Android系统所需要的关于该应用程序的必要信息,即在该应用程序的任何代码运行之前系统所必须拥有的信息。一个典型的Android应用程序的结构如下图所示:

 

二,主要功能

它指定了该应用程序的Java包:该包名作为应用程序的一个独特标识。

它描述了应用程序组件:该应用程序由哪些activity,service,broadcast receiver和content provider组成。它指定了实现每个组件的类以及公开发布它们的能力(例如,它们能持有哪个Intent信息)。这些声明使Android系统知道这儿有什么组件以及在什么条件下它们可以被载入。

它决定那些进程将容纳应用程序组件。

它声明了本应用程序必须拥有哪些许可,以便访问API的被保护部分,以及与其他应用程序交互。

它也声明了其他应用程序在和该应用程序交互时需要持有的许可。

它列出了Instrumentation类,可以在应用程序运行时提供简档和其他信息。这些声明仅当应用程序在开发和测试过程中被提供;它们将在应用程序正式发布之前被移除。

它声明了该应用程序所需的Android API的最小化水平。

它列出了该应用程序必须链接的库。 

三,主要结构及规则

下面列表显示了manifest文件的通常的结构以及它可以含有的元素。每个元素,连同它的所有属性,会在各个单独的文档里进行充分的描绘。 

<?xml version="1.0" encoding="utf-8"?> 
<manifest>  //根节点,描述了package中所有的内容 
    <uses-permission /> //请求你的package正常运作所需赋予的安全许可。一个manifest能包含零个或更多此元素 
    <permission />  //声明了安全许可来限制哪些程序能使用你的package中的组件和功能。一个manifest能包含零个或更多此元素 
    <permission-tree />  
    <permission-group /> 
    <instrumentation />  //声明了用来测试此package或其他package指令组件的代码。一个manifest能包含零个或更多此元素 
    <uses-sdk />  //指定当前应用程序兼容的最低sdk版本号 
    <application>  //包含package中application级别组件声明的根节点。此元素也可包含application中全局和默认的属性,如标签,icon,主题,必要的权限,等等。一个manifest能包含零个或一个此元素(不允许多余一个) 
        <activity>  //用来与用户交互的主要工具。当用户打开一个应用程序的初始页面时一个activity,大部分被使用到的其他页面也由不同的activity所实现并声明在另外的activity标记中。 
            <intent-filter>  //声明了指定的一组组件支持的Intent值 
                <action /> 
                <category /> 
                <data /> 
                    <type/> 
                    <schema/> 
                    <authority/> 
                    <path/> 
            </intent-filter> 
            <meta-data /> 
        </activity> 
        <activity-alias> 
            <intent-filter> . . . </intent-filter> 
            <meta-data /> 
        </activity-alias> 
        <service>  //Service是能在后台运行任意时间的组件 
            <intent-filter> . . . </intent-filter> 
            <meta-data/> 
        </service> 
        <receiver>   //IntentReceiver能使你的application获得数据的改变或者发生的操作,即使它当前不在运行 
            <intent-filter> . . . </intent-filter> 
            <meta-data /> 
        </receiver> 
        <provider>  //ContentProvider是用来管理持久化数据并发布给其他应用程序使用的组件 
            <grant-uri-permission /> 
            <meta-data /> 
        </provider> 
        <uses-library /> 
        <uses-configuration />   
    </application> 
</manifest>

下面是按照字母顺序排列的所有可以出现在manifest文件里的元素。它们是唯一合法的元素;你不能加入你自己的元素或属性。

<action> 
<activity> 
<activity-alias> 
<application> 
<category> 
<data> 
<grant-uri-permission> 
<instrumentation> 
<intent-filter> 
<manifest> 
<meta-data> 
<permission> 
<permission-group> 
<permission-tree> 
<provider> 
<receiver> 
<service> 
<uses-configuration> 
<uses-library> 
<uses-permission> 
<uses-sdk>

说明:AndroidManifest.xml文件的结构、元素,以及元素的属性,可以在Android SDK文档中查看详细说明。而在看这些众多的元素以及元素的属性前,需要先了解一下这些元素在命名、结构等方面的规则: 
    元素:在所有的元素中只有<manifest>和<application>是必需的,且只能出现一次。如果一个元素包含有其他子元素,必须通过子元素的属性来设置其值。处于同一层次的元素,这些元素的说明是没有顺序的。 
    属性:按照常理,所有的属性都是可选的,但是有些属性是必须设置的。那些真正可选的属性,即使不存在,其也有默认的数值项说明。除了根元素<manifest>的属性,所有其他元素属性的名字都是以android:前缀的; 
    定义类名:所有的元素名都对应其在SDK中的类名,如果你自己定义类名,必须包含类的数据包名,如果类与application处于同一数据包中,可以直接简写为“.”; 
    多数值项:如果某个元素有超过一个数值,这个元素必须通过重复的方式来说明其某个属性具有多个数值项,且不能将多个数值项一次性说明在一个属性中; 
    资源项说明:当需要引用某个资源时,其采用如下格式:@[package:]type:name。例如 <activity android:icon=”@drawable/icon ” . . . > 
    字符串值:类似于其他语言,如果字符中包含有字符“\”,则必须使用转义字符“\\”; 

四,详细说明

值得一提一些常用之处: 
1,几乎所有的AndroidManifest.xml(以及许多其他Android的xml的文件)在第一个元素中包含了命名空间的声明xmlns:android="http://schemas.android.com/apk/res/android"。这样使得Android中各种标准属性能在文件中使用,提供了大部分元素中的数据。 
2,大部分manifests包含了单个<application>的元素,它定义了所有的application级别组件和属性,并能在package中使用。 
3,任何被用户看作顶层应用程序,并能被程序启动器所用的package,需要包含至少一个Activity组件来支持MAIN操作和LAUNCHER种类。动作android.intent.action.MAIN指示这是应用程序的入口点。类别android.intent.category.LAUNCHER将此Activity放在启动器窗口中。

在最外层的<manifest>中包含了包名如 package="cn.androidlover.demo" 、软件的版本号 android:versionCode="1" 以及 android:versionName="1.0"的属性,而里面一层的<application>分支中将可能包含Android程序的四种对象 Activity、Service、Content Provider以及Receiver。我们每添加上面四个类型中的任一种新对象都需要在androidmanifest.xml文件中添加相应节点,否则运行时将会产生异常。每一个activity必须要一个<activity>标记对应,无论它给外部使用或是只用于自己的package中。如果一个activity没有对应的标记,你将不能运行它。

此文件一个重要的地方就是它所包含的intent-filters。这些filters描述了activity启动的位置和时间。每当一个activity(或者操作系统)要执行一个操作,例如:打开网页或联系簿时,它创建出一个intent的对象。它能承载一些信息描述了你想做什么,你想处理什么数据,数据的类型,和一些其他信息。Android比较了intent对象中和每个application所暴露的intent-filter中的信息,来找到最合适的activity来处理调用者所指定的数据和操作。关于intent的更多信息请访问Intent参考页面。

application属性介绍:

有关AndroidManifest.xml文件的application分支我们有必要了解一些常见的属性,这里可以看到一些我们实用的选项,比如允许调试android:debuggable、任务关系android:taskAffinity,比如我们常见的方式创建一个新的任务实用标记FLAG_ACTIVITY_NEW_TASK,为程序制定一个主题,可以使用android:theme指向一个主题文件。平时我们创建的程序使用一些安全敏感项,会需要请求系统许可权限,这里可以使用android:permission来制定相关的许可,每个程序的service、activity、content provider、receiver都需要在application的节点内实现。有关完整的属性可以查看:

1 <application android:allowClearUserData=["true" | "false"] 
2              android:allowTaskReparenting=["true" | "false"] 
3              android:debuggable=["true" | "false"] 
4              android:description="string resource" 
5              android:enabled=["true" | "false"] 
6              android:hasCode=["true" | "false"] 
7              android:icon="drawable resource" 
8              android:label="string resource" 
9              android:manageSpaceActivity="string" 
10              android:name="string" 
11              android:permission="string" 
12              android:persistent=["true" | "false"] 
13              android:process="string" 
14              android:taskAffinity="string" 
15              android:theme="resource or theme" > 
16     . . . 
17 </application>

另外:Activity的属性常用的可能为android:name和android:label两个,但我们需要了解所有的属性以帮助解决复杂的问题,完整的如下:

  • android:allowTaskReparenting=["true" | "false"]
  • android:alwaysRetainTaskState=["true" | "false"]
  • android:clearTaskOnLaunch=["true"" | "false"]
  • android:configChanges=[one or more of: "mcc" "mnc" "locale" "touchscreen" "keyboard" "keyboardHidden" "navigation" "orientation" "fontScale"]
  • 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:name="string"
  • android:noHistory=["true" | "false"]
  • android:permission="string"
  • android:process="string"
  • android:screenOrientation=["unspecified" | "user" | "behind" | "landscape" | "portrait" | "sensor" | "nonsensor"]
  • android:stateNotNeeded=["true" | "false"]
  • android:taskAffinity="string"
  • android:theme="resource or theme"
  • android:windowSoftInputMode=[one or more of: "stateUnspecified" "stateUnchanged" "stateHidden" "stateAlwaysHidden" "stateVisible" "stateAlwaysVisible" "adjustUnspecified" "adjustResize" "adjustPan"]

从Provider节点中用到的定义,可以看到包含了权限控制、排序方式完整的如下:

1 <provider android:authorities="list" 
2           android:enabled=["true" | "false"] 
3           android:exported=["true" | "false"] 
4           android:grantUriPermissions=["true" | "false"] 
5           android:icon="drawable resource" 
6           android:initOrder="integer" 
7           android:label="string resource" 
8           android:multiprocess=["true" | "false"] 
9           android:name="string" 
10           android:permission="string" 
11           android:process="string" 
12           android:readPermission="string" 
13           android:syncable=["true" | "false"] 
14           android:writePermission="string" > 
15 </provider>

而对于服务相关定义如下:

1 <service android:enabled=["true" | "false"] 
2          android:exported[="true" | "false"] 
3          android:icon="drawable resource" 
4          android:label="string resource" 
5          android:name="string" 
6          android:permission="string" 
7          android:process="string" > 
8 </service>

最后是Broadcast使用的Receiver定义,一般配合和隐式处理。

1 <receiver android:enabled=["true" | "false"] 
2           android:exported=["true" | "false"] 
3           android:icon="drawable resource" 
4           android:label="string resource" 
5           android:name="string" 
6           android:permission="string" 
7           android:process="string" > 
8 </receiver>

总之,AndroidManifest.xml文件虽然看起来复杂,但是,只要我们理清中里面各元素的作用,那么一切就变得简单了。

《完》