Android开发指南-框架主题-清单文件

清单文件The AndroidManifest.xml File

每个应用程序都有一个AndroidManifest.xml文件(一定是这个名字)在它的根目录里。这个清单文件给Android系统提供了关于这个应用程序的基本信息,系统在能运行任何程序代码之前必须知道这些信息。AndroidManifest.xml主要包含以下功能:

  • 命名应用程序的Java包,这个包名用来唯一标识应用程序;
  • 描述应用程序的组件-活动,服务,广播接收者,以及组成应用程序的内容提供器;对实现每个组件和公布其能力(比如,能处理哪些意图消息)的类进行命名。这些声明使得Android系统了解这些组件以及在什么条件下可以被启动;
  • 决定应用程序组件运行在哪个进程里面;
  • 声明应用程序所必须具备的权限,用以访问受保护的部分API,以及和其它应用程序交互;
  • 声明应用程序其他的必备权限,用以组件之间的交互;
  • 列举测试设备Instrumentation类,用来提供应用程序运行时所需的环境配置及其他信息,这些声明只在程序开发和测试阶段存在,发布前将被删除;
  • 声明应用程序所要求的Android API的最低版本级别;
  • 列举application所需要链接的库;

 

清单文件结构Structure of the Manifest File

下面的图表显示了清单文件的基本结构以及它能包含的所有元素。每个元素,和它所有的属性,在一个单独的文件中完整描述。要查看任何元素的细节信息,可在图表下方的以字符序排列的元素列表中点击其元素名称。

<?xml version="1.0" encoding="utf-8"?>

 

<manifest>

 

    <uses-permission />

    <permission />

    <permission-tree />

    <permission-group />

 

    <instrumentation />

 

    <uses-sdk />

 

    <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 />

        <uses-configuration /> 

 

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

文件约定File Conventions

下面是一些清单文件中适用于所有元素和属性的约定和规则:

元素Elements

在所有的元素中只有<manifest><application>是必需的,且只能出现一次。很多其他元素可以出现多次甚或一次都没有-尽管如果清单文件想要完成一些有意义的工作,必须设置至少其中的一些。如果一个元素包含点什么,那就是包含其他元素。所有的值必须通过属性来设置,而不是元素中的字符数据。同一级别的元素一般是没有顺序的。比如,<activity>, <provider>, <service> 元素可以以任意顺序混合使用。(<activity-alias>元素是个例外:它必须跟在该别名所指的<activity>后面。)

属性Attributes

正规意义上,所有的属性都是可选的,但实际上有些属性是必须为一个元素指定来完成其目标。把这篇文档当作一个指南。对于那些真正可选的属性,即使不存在一个规格,也会有默认的数值或状态。

除了根元素<manifest>的一些属性,所有其他元素属性的名字都是以android:作为前缀的-比如, android:alwaysRetainTaskState。因为这个前缀是通用的,这篇文档提及属性名称时一般会忽略它。

声明类名Declaring class names

很多对应于Java对象的元素,包括应用程序自己(<application>元素)以及它的基础组件-活动(<activity>),服务(<service>),广播接收器(<receiver>),以及内容提供器(<provider>)。

如果你定义一个子类,就像你将经常为组件类(Activity, Service, BroadcastReceiver, ContentProvider)所做的那样,这个子类通过一个名字属性来声明。这个名字必须包含完整的包名称。比如,一个服务Service子类可能会声明如下:

<manifest . . . >

    <application . . . >

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

            . . .

        </service>

        . . .

    </application>

</manifest>

不过,作为类名的简写,如果这个字符串的第一个字符是一个点号“.”,那么这个字符串将被扩展到应用程序包名的后面(正如<manifest>元素的package属性所指明的那样)。下面这个赋值和上面效果一样:

<manifest package="com.example.project" . . . >

    <application . . . >

        <service android:name=".SecretService" . . . >

            . . .

        </service>

        . . .

    </application>

</manifest>

当启动一个组件时,Android创建了一个命名子类的实例。如果没有指定一个子类,它创建基类的一个实例。

多数值项Multiple values

如果某个元素有超过一个数值,这个元素几乎总是需要被重复声明,而不能将多个数值项列举在一个属性中。比如,一个意图过滤器可以列举多个动作:

<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>

资源项Resource values

一些属性有能显示给用户的数值-比如,活动(activity)的一个标签和图标。这些属性的值应该被本地化,从一个资源或主题中设置。当需要引用某个资源时,采用如下的表述格式:

@[package:]type:name

这里package名称可以被忽略,要是资源和应用程序在同一个包里的话;type是资源的类型-"string""drawable"-而且name是用来标识特定资源的名字。例如

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

从主题获取的数据以类似的方式表述,不过以'?'而不是'@'开头。

?[package:]type:name

 

字符串值String values

如果属性值是一个字符串,则必须使用双反斜杠('//')来表示escape'/')字符;第一个反斜杠起转义字符的作用)。比如,'//n'表示换行或'//uxxxx'表示一个Unicode字符。

文件特性File Features

下面的章节描述了一些Android特性如何被映射到清单(manifest)文件中。

意图过滤器Intent Filters

应用程序的核心组件(活动,服务和广播接收器)通过意图被激活。意图是描述期望动作的信息包(一个Intent 对象)-包括要操作的数据,执行该动作的组件类别,以及其他有关指令。Android寻找一个合适的组件来响应这个意图,如果需要会启动这个组件一个新的实例,并传递给这个意图对象。

组件通过意图过滤器(intent filters通告它们所具备的能力-能响应的意图类型。由于Android系统在启动一个组件前必须知道该组件能够处理哪些意图,那么意图过滤器需要在manifest中以<intent-filter>元素指定。一个组件可以拥有多个过滤器,每一个描述不同的能力。

一个显式命名目标组件的意图将会激活那个组件;过滤器不起作用。但是一个没有指定目标的意图只在它能够通过组件过滤器任一过滤器时才能激活该组件。

请查看关于意图和意图过滤器的文档以获取更多信息:Intents and Intent Filters.

图标和标签Icons and Labels

许多元素有图标(icon)和标签(label)属性。其中一些还有一个描述(description)属性,可以用更长的解释性文字呈现给用户。比如,<permission>元素有所有这三个属性,因此当用户被询问是否授予一个应用程序请求的权限许可时,一个代表权限的图标,权限的名称和必定伴有的权限描述会全部被显示给用户。

所有的情况中,设置在一个包含元素里的图标和标签会成为该容器所有子元素的缺省设置。这样,在<application>元素中设置的图标和标签就是该应用程序每个组件的缺省图标和标签。类似的,为一个组件设置的图标和标签-比如,一个<activity>元素-是这个组件<intent-filter>元素的缺省值。如果一个<application>元素设置了一个图标,但活动及其意图过滤器没有,那么程序标签被当作活动和意图过滤器的标签。

当呈现给用户的组件实现一个意图过滤器公告的函数时,为这个过滤器设置的图标和标签将被用来代表这个组件。比如,一个设置了"android.intent.action.MAIN""android.intent.category.LAUNCHER"的过滤器公告了一个活动来初始化应用程序-也就是,会被显示在应用程序启动器中。因此设置在过滤器中的图标和标签也就是显示在启动器里的那些图标和标签。

许可Permissions

一个许可(permission是代码对设备上数据的访问限制。这个限制被引入来保护可能会被误用而曲解或破坏用户体验的关键数据和代码。

每个许可被一个唯一的标签所标识。这个标签常常指出了受限的动作。例如,下面是一些Android定义的许可:

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

一个功能(feature)最多只能被一个权限许可保护。

如果一个应用程序需要访问一个需要特定权限的功能,它必须在manifest文件中使用<uses-permission>元素来声明这一点。这样,当应用程序安装到设备上时,安装器可以通过检查签署应用程序认证的机构来决定是否授予请求的权限,在某些情况下,会询问用户。如果权限已被授予,那应用程序就能够访问受保护的功能特性。如果没有,访问将失败,但不会给用户任何通知。

应用程序还可以通过权限许可来保护它自己的组件(活动,服务,广播接收器,和内容提供器)。它可以利用Android已经定义(列在android.Manifest.permission里)或其他应用程序已声明的权限许可。或者定义自己的许可。一个新的许可通过<permission>元素声明。比如,一个活动可以用下面的方式保护:

<manifest . . . >

    <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>

    . . .

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

    . . .

</manifest>

注意,在这个例子里,这个DEBIT_ACCT 许可并非仅仅在<permission>元素中声明,它同样声明在<uses-permission>元素里。为了应用程序的其他组件可以启动这个受保护的活动,必须请求它的使用(use),即使这个保护是应用程序自己引入的。

如果,就在这个例子里,这个permission 属性被设置为在其他地方声明的权限许可(例如android.permission.CALL_EMERGENCY_NUMBERS,它将不需要再次声明它,但是,它仍然需要通过<uses-permission>来请求它的使用。

这个<permission-tree> 元素为一组想在代码中定义的权限许可声明了一个命名空间。而<permission-group> 元素为一系列许可定义了一个标签(用<permission>元素定义在manifest中的以及其他地方声明的)。它仅仅影响这些权限许可在显示给用户时如何分组。<permission-group> 元素并不指明哪个权限属于这个分组;它只是给这个组命名。一个权限许可通过给<permission>元素的permissionGroup属性赋予这个组名来放置到这个权限组中。

Libraries

每个应用程序都链接到缺省的Android库,这个库包含了基础应用程序开发包(实现了基础类如活动,服务,意图,视图,按钮,应用程序,内容提供器,等等)

然而,一些包处于它们自己的库中。如果你的应用程序使用了其他开发包中的代码,它必须显式的请求链接到它们。这个manifest必须包含一个单独的<uses-library>元素来命名每一个库。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值