你好,游客 登录 注册 搜索
背景:
阅读新闻

Android 程序清单文件详解 - 引路蜂移动软件

[日期:2013-04-07] 来源:  作者: [字体: ]

每个Android应用都需要一个名为AndroidManifest.xml的程序清单文件,这个清单文件名是固定的并且放在每个Android应用的根目录下。它定义了该应用对于Android系统来说一些非常重要的信息。Android系统需要这些信息才能正常运行该应用。Android程序清单文件主要具有下面作用:

·        它给应用程序Java包命名,这个包名作为应用程序唯一标识符。

·        它描述了应用程序中的每个程序组件—Activity,Service,Broadcast Receivers和Content Provider。它描述了实现每个应用程序组件的类名称和组件能力(比如组件能够处理哪种类型的Intent消息)。这些描述帮助Andoid操作系统了解这些程序组件和在何种条件下可以启动这些程序组件。

·        它决定哪些进程用来运行应用程序组件。

·        它描述了应用程序使用某些受保护的程序API或和其它应用程序交互所需的权限。

·        它也描述了其它应用程序和该应用交互时应拥有的权限。

·        它列出了Instrumentation类用于提供应用程序运行时一些性能统计和其它信息。这些生命只在测试或开发应用时使用。在发布应用时应该删除。

·        它给出了应用运行所需AndroidAPI版本的最低要求。

·        它列出了应用程序需要调用的开发库定义。

 

 清单文件结构

下面XML代码给出了程序清单文件的基本结构以及它所能包含的所有元素。每个元素及元素支持的属性可以参考Android开发文档。

<?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 />
            <path-permission />
        </provider>

        <uses-library />

    </application>

</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> 
<supports-screens> 
<uses-configuration> 
<uses-feature> 
<uses-library> 
<uses-permission> 
<uses-sdk>


 一些使用惯例

下面为使用元素和属性时一些惯例和原则:

元素

只有<mainifest>和<application>元素是必须的,这两个元素必须在程序清单中定义,并且只能出现一次。其它元素可以不出现或出现多次—尽管其中有些元素是一个有实用意义的程序清单文件所必须的。

如果一个元素包含其它元素,所有的值都是通过属性来定义而不是通过元素内容来定义。

同一层次的元素之间没有先后顺序的关系。比如<activity>,<provider>和<service>可以以任何次序出现或交替出现(一个特例是<activity-alias>,它必需紧跟在它对应的<activity>之后)

属性

严格上来说,所有的属性都是可选的。但实际上必须定义某些元素的属性值才能使用该元素有实际意义。具体可以参考开发文档,如果某个属性确实是可选的,开发文档定义了它的缺省值。

除了根元素<manifest>的一些属性,其它所有属性的属性名称都是以android:作为前缀。比如android:alwaysRetainTaskState。

申明类名称

有很多元素对应到某个Java对象,包括应用程序元素本身(<application>元素)和一些主要的程序组件—Activity(<activity>),Service(<service>,BroadcastReceiver (<receiver>)和ContentProvider(<provider>)。

如果你定义子类,对于应用程序组件(Activity,Service,BroadcastReceiver和ContentProvider)来说,这是非常普遍的情况。子类名称通过name属性来定义。这个名成必须包括类定义完整的包定义。比如一个Service的子类可以有如下定义:

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


    然而,为了简化起见,如果name属性的第一个字符为“.”,那么name属性的值会添加到应用程序包名称(由<manifest>元素的<package>属性定义)作为完整的类名称。下面代码实现上面代码同样的功能:

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


    Android系统中启动某个程序组件时会创建该子类的一个实例,如果没有指明子类的名称,Android系统将创建其基类的实例。

多个值

如果可以为某个元素设置多个值,那么对每个值都要重复元素定义,而不使用一个元素定义定义多个值。比如,一个intent可以使用多个过滤动作:

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


   资源值

  一些属性可以有显示给用户的资源值—比如,某个Activity可以有标题和一个图标。这些属性值应当提供本地化支持并且可以通过显示主题来设置其值。

资源值可以使用如下格式来定义:

@ [package:] type: name

其中package名称当资源和应用程序中同一个包中时可以忽略,type为资源类型,比如string或drawable,name为资源的标识符。比如:

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


    对于来自某个主题中的资源使用类似的格式,当以“?”开头而非“@”开头。

? [package:] type: name

字符串值

当某个属性值为一字符串时,必须使用双“\”来转义某些特殊字符,比如 “\\n”  代表新行或“\\uxxxx”  代表某个Unicode字符。

 Android特性设置

下面给出了如何在程序清单中设置某些Android相关的特性。

Intent Filter

应用程序的核心组件(Activity,Service和Boradcast Reciever)都是通过Intent来触发的。一个Intent为一组用来描述动作的信息包(Intent对象)--包括动作处理的数据,能够执行该动作的组件的分类等等。Android根据Intent找到合适的程序组件来响应该Intent,如果有需要创建程序组件的一个新实例并传入Intent对象。

应用程序组件发布它们的处理能力—能够处理的Intent的种类—通过IntentFilter定义。由于Android系统必须事先了解那个程序组件能处理哪类Intent才能启动合适的程序组件,因此必须在程序清单中通过<intent-filter>来定义Intent Filter。一个应用程序组件可以有多个Intent Filter,每个Intent Filter使用独立的一行字程序清单中定义。

一个明确指明了目标程序组件名称的Intent对象将触发对应的程序组件,此时Intent Filter不起作用。但在Intent没有明确指明目标程序组件名称时,只有在目标程序组件满足Intent Filter定义的过滤条件时才会启动。

图标和标题

某些元素支持使用图标和标题属性,用来显示给最终用户。其中某些元素还支持description属性来定义一较长的描述用来显示在屏幕上。比如<permission>元素包括上面三个属性,因此在询问用户是否赋予程序权限时显示给用户。

在所有情况下,在父元素中定义的icon和label属性成为其子元素的缺省icon和label属性。因此定义在<application>元素的icon和label属性成为定义在其中的<activitiy>的缺省icon和label属性。同样,<activity>元素的icon和lable属性也成为其中定义的<intent-filter>的缺省属性。比如<application>元素定义了label属性,而<activity>及<intent-filter>都没有定义label属性,那么由application元素定义的 label属性将作为activity 和 intent-filter的label属性。

权限

Permission 用来限制对设备上某部分代码或是数据的访问。

每种Permission由唯一的字符串来定义,通常这个字符串表明了它所限制的动作。比如,下面是Android定义的部分权限:

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

    一个Android功能通常由一个对应的权限来保护。

如果一个应用需要使用由权限保护的某个功能,它必须在程序清单文件中使用<uses-permission>标记来声明。然后,当安装该应用时,安装程序通过询问用户是否赋予该应用所需的权限。如果赋予所需权限,应用可以使用该功能,否则,调用失败并且不会通知用户。

一个应用也可以通过权限来保护其定义的程序组件(比如Activity,Service或Content Provider)。它可以使用Android或是其它应用定义的权限,也可以使用新定义的权限。新定义的权限使用<permission>元素在程序清单中声明。比如,保护一个Activity可以使用如下代码:

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


值得注意的是,在本例中DEBIT_ACCT权限不仅仅使用<permission>给出了定义,使用它时还需要使用<uses-permission>元素来声明。对该权限的使用必须事先请求以实现其它应用能够启动这个受保护的Activity。

如果例子中使用的permission属性设置为由其它地方定义的权限(比如android.permission.CALL_EMERGENCY_NUMBER) ,那么就没有必要再使用<permission>声明。然而依然需要通过<uses-permission>来请求权限。

<permission-tree>元素定义了定义在代码中一组权限的命名空间,而<permission-group>定义了一组权限的标题。它们只影响如何将这些权限分组显示给用户。元素<permission-group>没有定义哪个权限属于哪个分组,而只是定义了权限分组的名称。一个权限通过<permission>元素的<permissionGroup>属性来定义其属于哪个分组。

开发库

每个Android应用都链接到缺省的Android开发库,这个库包括构造应用的基本开发包(包含Activity,Service,Intent,View,Button,Application,ContentProvider等类定义)。

然而,某些开发包有自己独立的库文件。如果你的应用使用了这些开发包,必须在程序清单中明确申明需要链接到这些库文件。对于使用到的开发包,在清单文件中使用不同的<uses-library>元素来声明。





收藏 推荐 打印 | 录入:admin | 阅读:
相关新闻