AndroidManifest配置文件解析之一——介绍

 

自己学习笔记,英语水平不好,翻译能力有限,不喜勿喷,谢谢

 

每个Application在根目录下必须有一个AndroidManifest.xml文件。

一、这个文件包含了app的Android 系统信息。

  1.它表明了App的唯一标示。Application以AndroidManifest中manifest中的包名区分

  2.它描述了Application的组件-----activity、service、broadcast receiver和content provice。这些描述是Android系统知道这些组件,并且指导在什么情况下启动这些组件。

  3.它表明了哪个process host 这些组件。

  4.它表明了 App为了获取API保护的内容或者是其他程序的内容所需要的permission。

  5.它表明了其他App想要获取本App的组件所需要的权限。

  6.它罗列了Instrumentation类,这些类提供了一些App运行时候的信息。这些声明存在与App开发或者测试阶段,App发布的时候,应该移除。

  7.它表明了App所要求的Android API的最小版本。

  8.它罗列了App所必须关联的一些library。

二、Manifest文件的结构

  以下表明了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 />
            <path-permission />
        </provider>

        <uses-library />

    </application>

</manifest>

三、文件约定

一些约定和规则通常应用在Manifest的标签和属性中

Element

  只有<manifest>和<application>元素只能出现一次,其他Element可以出现一次或多次,或者不出现。

  如果一些Element包含其他的element,所有的值必须通过attribute设置。

  所有的同级的element是平等的,不分顺序。例如<activity>,<service>和<provider>能够以任意顺序出现。(<activity-alias>是个特例,它需要在设置别名的<activity>之后)。

Attribute

  从正式意义上来说,所有的attribute都是可选的。但是有一些特殊的element的attribute为了达到某一目的,必须设置值。其他的不是必须设值得attribute也都有其默认值。

  除了根节点<manifest>的一些attribute外,所有的attribute名 都必须以 android:为前缀。例如:android:alwaysRetainTaskState

Declaring class names

  很多element都和Java的类相对应,包括application这个element(<application)。

    Application---<application>

    Activity---<activity>

    Service---<service>

    BroadcastReceiver---<receiver>

    ContentProvicer---<provider>

  当你定义一个Android组件 (Activity,Service,BroadcastReceiver, and ContentProvicer)的子类的时候,以name这个attribute来声明。这个属性值要包含完整的包名。例如,一个Service子类的声明:

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

   然而,如果要声明的组件是在Application的标记包(暂且叫标记包,即<manifest>的package属性)下,或者是标记包的子包,组件的name可以省略标记包名。例如:

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

  如果不止一个value被设定,则element通常也是有多个,而不是在一个element中罗列多个value。例如:一个Intent可以设置多个action值:

<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

  一些attribute的值是可以展示给用户的,例如一个activity的label或者icon。这些attribute的值是通过一个resource或者theme来在局部设定的。

  resource的值以以下格式标示

@[package:]type:name

如果资源是和Application的标记包同包,则package可以省略,type是资源的类型,例如“string”或者“drawable”等。name是标记资源的唯一名称。例如:

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

一个theme的value标示方法与此相似,但是它是以‘?’开头而不是‘@’

?[package:]type:name
String values

  当一个attribute的value是一个字符串时,双反斜杠(‘\\’)必须当做转移字符,例如:

    '\\n'标示开始新的一行,'\\uxxxx'标示一个统一字符。

 

四、文件特征

以下来描述怎样通过Manifest文件来映射Android特征的:

Intent Filters

  Application的核心组件(Activity,Service,BroadcastReceivers)是通过Intent来启动的。Intent filter来决定启动那个对应的组件。intent filter在manifest文件中是 <intent-filter> element。一个组件可以对应多个filter,来实现不同的功能。

  通过Intent明确指定需要开启的组件的名称的时候,filter是不起作用的。但是当Intent没有一个明确的指定需要开启的组件的名称,可以通过filter指定需开启的组件的filter。

  想了解更多请查看 Intents and Intent Filters

Icons and Lables

  多数的element都会有一个 icon 和 lable attribute 来指定一个小图标和标签来展示给用户。还有一些element可以有 description attribute 来指定一个在屏幕上显示的较长的扩展文本。例如:<premisiion> element就有这3个属性。

  通常,图标的标签都是默认的在子element中。默认的 icon 和 lable 是在 <application> element 中设置的。同样, 也可以为组件设置icon 和 lable这些属性---例如:<activity> element,可以为组件不同的<intent-filter>设置不同的 icon 和 lable。如果组件和组件的<intent-filter>都没设置icon 和 lable,就会用默认的。

Permission

  permission是访问device的代码或者数据的一个约束。这个约束用来保护数据免受扭曲,或者避免毁坏用户体验。

  每个permission通过一个唯一的lable来区分。通常,这些lable表明被限制的action。例如,以下是Android来定义的几个permission:

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

  如果一个Application需要使用一些被permission保护的特性,需要在manifest的<user-permission>来表明。Application在被安装到device时,会显示Application所需要的被permission保护的特性给用户,用户可以选择是否同意Application使用这些feature。

  application也可以通过permission来保护自己的组件。通过Android(罗列在android.Manifest.premission)来自定义permission。新的permission是用<permission> element 来标示的。例如:

<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 不仅仅在<permission> element中声明,为了使app其他的组件能够使用被保护的activity,也用在<user-permission> element。

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

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

Libraries

  每个应用程序都会链接默认的Android类库,包括构建程序的基本程序包(如,Activity、Service、Intent、View、Button、Application、ContentProvider等等)。

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

posted on 2014-07-11 00:45  罗运龙  阅读(218)  评论(0)    收藏  举报