AndroidManifest.xml文件详解(三)

长平狐 发布于 2012/10/16 10:16
阅读 78
收藏 0

文件功能

以下章节介绍清单文件是如何反映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>元素。

 


原文链接:http://blog.csdn.net/fireofstar/article/details/7543067
加载中
返回顶部
顶部