分享

AndroidManifest.xml的作用

 开花结果 2012-02-16

         之前在参加android的培训时候有接触过,不过当时没有进一步了解。在网上搜索了一下,很多地方解释太多,下面摘抄自培训老师jollen的blog,简洁易懂:

         AndroidManifest.xml 是一个用来描述 Android 应用程式「整体资讯」的设定档。简单来说,这是一个「自我介绍」档,我们可以向 Android 系统「介绍」我们的 Android 应用程式,以便让 Android 系统完整地了解我们的应用程式资讯。

在 [教学, #9] 中,我们提及:「在这里修改 AndroidManifest.xml 的目的是为了『在我们的 Android 应用程式里加入一个 Service 类别』,这样才有办法启动 Service...」这个工作的目的是为了向 Android 系统做二项自我介绍。说明如下。

1. 应用程式「实作了一个 MokoService 类别」

<application android:icon="@drawable/icon" android:label="@string/app_name"> ...
<service android:name=".MokoService"> ...
</service> ...
</application>

在 application 标签里加入 ‘service’ 标签,告诉 Android 系统我们的应用程式有一个叫做「MokoService」的类别。「android:name」属性用来指定 Service 的类别名称,别忘了在 AndroidManifest.xml 里,类别名称都是以「.」(小数点)开始。

2. MokoService 类别可处理「com.moko.hello.START_MUSIC」意图

<service android:name=".MokoService"> <intent-filter>
<action android:name="com.moko.hello.START_MUSIC" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter> </service>

         在 service 标签里加入 ‘intent-filter’ 标签,告诉 Android 系统我们的应用程式可「滤出」哪一个「Intent」。在前面的教学里,我们把 Intent 暂时解释为 Event(事件);因此,这里的「自我介绍」用意是为了告诉 Android 系统,我们可接受的事件名称为何。

我们只要在 intent-filter 标签里加入 ‘action’ 标签,并指定 action 标签的 android:name 属性即可。Intent 的命名规则为「xxx.yyy.NAME」的路径命名法。

         当 Android 收到由 Activity 发出的 Intent 后,便去找寻可处理 com.moko.hello.START_MUSIC 的类别,然后载入并启动此类别。

最后,在 ’intent-filter’ 里加入 ‘category’ 标签,用来定义 com.moko.hello.START_MUSIC 的分类,在这里指定为预设类别 「android.intent.category.DEFAULT」,这是一个 Android 定义的常数。完整的 Service 类别「自我介绍」标签与属性,可参考 Android SDK 的说明。

------------------------------------------------------------------------------------------------------------------------------------------------------------------

每个Androidapplication都必须包含一个 AndroidManifest.xml,且文件名是固定的,不能修改。应用程序需要通过它向Android系统提供一些必需的信息,且需要在 application运行前提供给系统

 

一个常见的AndroidManifest.xml文件如下:

 

 

AndroidManifest.xml描述了该应用的相关信息,主要包括以下各个元素:

 

A包名(package):指定本应用内java主程序包的包名。当没有指定apk的文件名时,编译后产生程序包将以此命名。本包名应当在Android系统运行时唯一。

B认证(certificate):指定本应用程序所授予的信任级别,目前有的认证级别有platform(system)sharedmedia以及应用自定义的认证。不同的认证可以享受不同的权限。

 C权限组(permission-group):权限组的定义是为了描述一组具有共同特性的权限。

 D权限(permission):权限用来描述是否拥有做某件事的权力。Android系统中权限是分级的,前分为普通级别(Normal),危险级别(dangerous),签名级别(signature)和系统/签名级别(signature or system)。系统中所有预定义的权限根据作用的不同,分别属于不同的级别。对于普通和危险级别的权限,我们称之为低级权限,应用申请即授予。其他两级权限,我们称之为高级权限或系统权限,应用拥有platform级别的认证才能申请。当应用试图在没有权限的情况下做受限操作,应用将被系统杀掉以警示。系统应用可以使用任何权限。权限的声明者可无条件使用该权限。

E权限树(permission-tree):权限树的设置是为了统一管理一组权限,声明于该树下的权限所有者归属该应用。系统提供了API,应用可以在运行时动态添加。 PackageManager.addPermission()

 F使用权限(uses-permission):应用需要的权限应当在此处申请,所申请的权限应当被系统或某个应用所定义,否则视为无效申请。同时,使用权限的申请需要遵循权限授予条件,非platform认证的应用无法申请高级权限。

 GSDK(uses-sdk):标识本应用运行的SDK版本。高兼容性的应用可以忽略此项。

Happlication:applicationAndroid应用内最高级别(top level)的模块,每个应用内最多只能有一个application,如果应用没有指定该模块,一个默认的application将被启用。 application将在应用启动时最先被加载,并存活在应用的整个运行时生命周期。因此一些初始化的工作适合在本模块完成. Application元素有许多属性,其中:“persistent”表示本应用是否为常驻内存,“enable”表示本应用当前是否应当被加载。

 Iactivity:activity application模块的运行时子元素,标识了一个UI。除了application,一个应用可以声明并实现零至多个其它运行时模块,activity也同样。activity也包含了许多定义它工作状态的属性,其中:“name”是必须的,它指定了该activity所在的文件名,如果该文件所属包不同于该应用的包名(即本描述文件的最开始处),那么名字前面需要加入所在包名。activity通过增加intent- fliter来标识哪些intent可以被处理,同时intent也是调度activity的主要参数。

 Jreceiver:receiver 也是application的运行时子元素。receiver通过增加intent-fliter来标识它需要接受哪些intent。当收到intent 后,receiver将根据不同的intent进行不同的处理。当一个Intent发出后,所有注册了该intentreceiver都将会收到,系统会根据receiver在系统中的注册次序顺序发送。当一个receiver处理完该Intent后,系统才会向下一个receiver发送。当一个receiver有多个未接收的intent时,将按照intent发送的次序顺序接收。

 Kservice:service也是application的运行时子元素。Service属于后台模块,启动后将长时间运行,除非停止该service或所在应用进程被杀死。

 Lprovider:provider 也是application的运行时子元素。它继承于ContentProvider,是对该应用管理的用户数据的结构化接入,是基于数据库操作方式的封装。如果应用允许外部应用访问/管理它的用户数据,providerAndroid平台提供的最佳方式。

 Mactivity-alias:顾名思义,是已有activity的别名。

 Nuses-library:标识应用启动所必须的共享库。

 

每个元素节点都有对个属性来描述该节点的信息,最常用的属性有:android:name=".MyName",定义了节点的文件名,这些声明的属性共同构成了元素节点的信息。

例如:Activity的属性常用的可能为android:nameandroid: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"

具体属性含义可参考SDK描述。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多