`
Jacular
  • 浏览: 178249 次
  • 性别: Icon_minigender_1
  • 来自: 云南
社区版块
存档分类
最新评论

AndroidManifest.xml文件的理解

 
阅读更多
一,重要性

AndroidManifest.xml是Android应用程序中最重要的文件之一。它是Android程序的全局配置文件,是每个 android程序中必须的文件。它位于我们开发的应用程序的根目录下,描述了package中的全局数据,包括package中暴露的组件 (activities, services, 等等),以及他们各自的实现类,各种能被处理的数据和启动位置等重要信息。
因此,该文件提供了Android系统所需要的关于该应用程序的必要信息,即在该应用程序的任何代码运行之前系统所必须拥有的信息。一个典型的Android应用程序的结构如下图所示:



二,主要功能

它指定了该应用程序的Java包:该包名作为应用程序的一个独特标识。

它描述了应用程序组件:该应用程序由哪些activity,service,broadcast receiver和content provider组成。它指定了实现每个组件的类以及公开发布它们的能力(例如,它们能持有哪个Intent信息)。这些声明使Android系统知道这 儿有什么组件以及在什么条件下它们可以被载入。

它决定那些进程将容纳应用程序组件。

它声明了本应用程序必须拥有哪些许可,以便访问API的被保护部分,以及与其他应用程序交互。

它也声明了其他应用程序在和该应用程序交互时需要持有的许可。

它列出了Instrumentation类,可以在应用程序运行时提供简档和其他信息。这些声明仅当应用程序在开发和测试过程中被提供;它们将在应用程序正式发布之前被移除。

它声明了该应用程序所需的Android API的最小化水平。

它列出了该应用程序必须链接的库。

三,主要结构及规则

下面列表显示了manifest文件的通常的结构以及它可以含有的元素。每个元素,连同它的所有属性,会在各个单独的文档里进行充分的描绘。

<?xml version="1.0" encoding="utf-8"?>
<manifest>  //根节点,描述了package中所有的内容
     <uses-permission /> //请求你的package正常运作所需赋予的安全许可。一个manifest能包含零个或更多此元素
     <permission />  //声明了安全许可来限制哪些程序能使用你的package中的组件和功能。一个manifest能包含零个或更多此元素
     <permission-tree /> 
     <permission-group />
     <instrumentation />  //声明了用来测试此package或其他package指令组件的代码。一个manifest能包含零个或更多此元素
     <uses-sdk />  //指定当前应用程序兼容的最低sdk版本号
     <application>  //包含package中application级别组件声明的根节点。此元素也可包含application中全局和默认的属性,如标签,icon,主 题,必要的权限,等等。一个manifest能包含零个或一个此元素(不允许多余一个)
         <activity>  //用来与用户交互的主要工具。当用户打开一个应用程序的初始页面时一个activity,大部分被使用到的其他页面也由不同的activity所实现并声明在另外的activity标记中。
             <intent-filter>  //声明了指定的一组组件支持的Intent值
                 <action />
                 <category />
                 <data />
                     <type/>
                     <schema/>
                     <authority/>
                     <path/>
             </intent-filter>
             <meta-data />
         </activity>
         <activity-alias>
             <intent-filter> . . . </intent-filter>
             <meta-data />
         </activity-alias>
         <service>  //Service是能在后台运行任意时间的组件
             <intent-filter> . . . </intent-filter>
             <meta-data/>
         </service>
         <receiver>   //IntentReceiver能使你的application获得数据的改变或者发生的操作,即使它当前不在运行
             <intent-filter> . . . </intent-filter>
             <meta-data />
         </receiver>
         <provider>  //ContentProvider是用来管理持久化数据并发布给其他应用程序使用的组件
             <grant-uri-permission />
             <meta-data />
         </provider>
         <uses-library />
         <uses-configuration />  
     </application>
</manifest>

下面是按照字母顺序排列的所有可以出现在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>

说明:AndroidManifest.xml文件的结构、元素,以及元素的属性,可以在Android SDK文档中查看详细说明。而在看这些众多的元素以及元素的属性前,需要先了解一下这些元素在命名、结构等方面的规则:
     元素:在所有的元素中只有<manifest>和<application>是必需的,且只能出现一次。如果一个元素包含有其他子元素,必须通过子元素的属性来设置其值。处于同一层次的元素,这些元素的说明是没有顺序的。
     属性:按照常理,所有的属性都是可选的,但是有些属性是必须设置的。那些真正可选的属性,即使不存在,其也有默认的数值项说明。除了根元素<manifest>的属性,所有其他元素属性的名字都是以android:前缀的;
     定义类名:所有的元素名都对应其在SDK中的类名,如果你自己定义类名,必须包含类的数据包名,如果类与application处于同一数据包中,可以直接简写为“.”;
     多数值项:如果某个元素有超过一个数值,这个元素必须通过重复的方式来说明其某个属性具有多个数值项,且不能将多个数值项一次性说明在一个属性中;
     资源项说明:当需要引用某个资源时,其采用如下格式:@[package:]type:name。例如 <activity android:icon=”@drawable/icon ” . . . >
     字符串值:类似于其他语言,如果字符中包含有字符“\”,则必须使用转义字符“\\”;

四,详细说明

值得一提一些常用之处:
1,几乎所有的AndroidManifest.xml(以及许多其他Android的xml的文件)在第一个元 素中包含了命名空间的声明xmlns:android="http://schemas.android.com/apk/res/android"。这 样使得Android中各种标准属性能在文件中使用,提供了大部分元素中的数据。
2,大部分manifests包含了单个<application>的元素,它定义了所有的application级别组件和属性,并能在package中使用。
3, 任何被用户看作顶层应用程序,并能被程序启动器所用的package,需要包含至少一个Activity组件来支持MAIN操作和LAUNCHER种类。 动作android.intent.action.MAIN指示这是应用程序的入口点。类别 android.intent.category.LAUNCHER将此Activity放在启动器窗口中。

在最外层的<manifest>中包含了包名如 package="cn.androidlover.demo" 、软件的版本号 android:versionCode="1" 以及 android:versionName="1.0"的属性,而里面一层的<application>分支中将可能包含Android程序的 四种对象 Activity、Service、Content Provider以及Receiver。我们每添加上面四个类型中的任一种新对象都需要在androidmanifest.xml文件中添加相应节点,否 则运行时将会产生异常。每一个activity必须要一个<activity>标记对应,无论它给外部使用或是只用于自己的package 中。如果一个activity没有对应的标记,你将不能运行它。

此文件一个重要的地方就是它所包含的intent-filters。这些filters描述了activity启动的位置和时间。每当一个 activity(或者操作系统)要执行一个操作,例如:打开网页或联系簿时,它创建出一个intent的对象。它能承载一些信息描述了你想做什么,你想 处理什么数据,数据的类型,和一些其他信息。Android比较了intent对象中和每个application所暴露的intent-filter中 的信息,来找到最合适的activity来处理调用者所指定的数据和操作。关于intent的更多信息请访问Intent参考页面。

application属性介绍:

有关AndroidManifest.xml文件的application分支我们有必要了解一些常见的属性,这里可以看到一些我们实用的选项,比 如允许调试android:debuggable、任务关系android:taskAffinity,比如我们常见的方式创建一个新的任务实用标记 FLAG_ACTIVITY_NEW_TASK,为程序制定一个主题,可以使用android:theme指向一个主题文件。平时我们创建的程序使用一些 安全敏感项,会需要请求系统许可权限,这里可以使用android:permission来制定相关的许可,每个程序的service、 activity、content provider、receiver都需要在application的节点内实现。有关完整的属性可以查看:

1 <application android:allowClearUserData=["true" | "false"]
2              android:allowTaskReparenting=["true" | "false"]
3              android:debuggable=["true" | "false"]
4              android:description="string resource"
5              android:enabled=["true" | "false"]
6              android:hasCode=["true" | "false"]
7              android:icon="drawable resource"
8              android:label="string resource"
9              android:manageSpaceActivity="string"
10              android:name="string"
11              android:permission="string"
12              android:persistent=["true" | "false"]
13              android:process="string"
14              android:taskAffinity="string"
15              android:theme="resource or theme" >
16     . . .
17 </application>

另外:Activity的属性常用的可能为android:name和android: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"
• android:theme="resource or theme"
• android:windowSoftInputMode=[one or more of: "stateUnspecified" "stateUnchanged" "stateHidden" "stateAlwaysHidden" "stateVisible" "stateAlwaysVisible" "adjustUnspecified" "adjustResize" "adjustPan"]


从Provider节点中用到的定义,可以看到包含了权限控制、排序方式完整的如下:

1 <provider android:authorities="list"
2           android:enabled=["true" | "false"]
3           android:exported=["true" | "false"]
4           android:grantUriPermissions=["true" | "false"]
5           android:icon="drawable resource"
6           android:initOrder="integer"
7           android:label="string resource"
8           android:multiprocess=["true" | "false"]
9           android:name="string"
10           android:permission="string"
11           android:process="string"
12           android:readPermission="string"
13           android:syncable=["true" | "false"]
14           android:writePermission="string" >
15 </provider>

而对于服务相关定义如下:

1 <service android:enabled=["true" | "false"]
2          android:exported[="true" | "false"]
3          android:icon="drawable resource"
4          android:label="string resource"
5          android:name="string"
6          android:permission="string"
7          android:process="string" >
8 </service>

最后是Broadcast使用的Receiver定义,一般配合和隐式处理。

1 <receiver android:enabled=["true" | "false"]
2           android:exported=["true" | "false"]
3           android:icon="drawable resource"
4           android:label="string resource"
5           android:name="string"
6           android:permission="string"
7           android:process="string" >
8 </receiver>

总之,AndroidManifest.xml文件虽然看起来复杂,但是,只要我们理清中里面各元素的作用,那么一切就变得简单了。
分享到:
评论

相关推荐

    AndroidManifest.xml文件详解.ppt

    AndroidManifest.xml可以理解为android的一个注册表文件,在这个文件中,我们可以声明我们自己定义的权限,这个工程被赋予的权限已经所有应用组件的相关配置工作。Manifest, 描述:根节点,用来描述.apk文件,...

    java读取apk名称、图片、文件解压、读取

    完整apk读取,如不理解,可加我QQ咨询:444972427~非技术人员请勿打扰~ 1.bat是直接用来测试AXMLPrinter...3.test读取apk中AndroidManifest.xml文件 4.ZipUtils解压文件 5.JFileSearch查询文件 6.ReadFromFile读文件

    post_pc_ex_4

    寻找根源 面向开发人员的Android练习,教他们如何玩意向,活动,服务... 文件AndroidManifest.xml包含应用程序中所有活动和服务的定义。 必须在其中定义任何扩展Activity或Service类,否则您将无法在应用程序中使用它。

    Android四大组件知识点总结

    预备知识 1. Intent Intent是信使,负责完成Android四大组件之间的信息传递,同类、不同类的组件无法直接传递对象,...四大组件都需要通过项目中的AndroidManifest.xml文件进行静态注册后才可正常使用,其中Broadcast

    Android编程之在SD卡上进行文件读写操作实例详解

    本文实例讲述了Android编程之在SD卡上进行文件读写操作的方法。分享给大家供大家参考,具体如下: 很多知识只有真正理解掌握之后才能运用自如,举一反三...在配置文件里AndroidManifest.xml里面添加SD卡读写数据权限。

    《Google Android 揭秘》(美) W.Frank Ableson 著

    这是一本全面介绍Android相关知识的图书,全书分为三个部分,由浅入深,从Android初级知识,讲到一些关于核心编程的实用示例,最后还讨论了一些...3.4 理解AndroidManifest文件 81 3.5 小结 84 第4章 Intent与服务 85

    疯狂Android讲义源代码2

    1.5.4 Android应用的清单文件:AndroidManifest.xml 1.5.5 应用程序权限说明 1.6 Android应用的基本组件介绍 1.6.1 Activity和View 1.6.2 Service 1.6.3 BroadcastReceiver 1.6.4 ContentProvider 1.6.5 ...

    精通ANDROID 3(中文版)1/2

    7.5 通过XML文件加载菜单  7.5.1 XML菜单资源文件的结构  7.5.2 填充XML菜单资源文件  7.5.3 响应基于XML的菜单项  7.5.4 其他XML菜单标记简介  7.6 资源  7.7 小结  第8章 使用对话框  8.1 使用...

    精通Android 3 (中文版)2/2

    7.5 通过XML文件加载菜单  7.5.1 XML菜单资源文件的结构  7.5.2 填充XML菜单资源文件  7.5.3 响应基于XML的菜单项  7.5.4 其他XML菜单标记简介  7.6 资源  7.7 小结  第8章 使用对话框  8.1 使用...

    新版Android开发教程.rar

    ----------------------------------- Android 编程基础 1 封面----------------------------------- Android 编程基础 2 开放手机联盟 --Open --Open --Open --Open Handset Handset Handset Handset Alliance ...

    谈谈Android里的Context的使用

    其实我们应用启动的时候会启动Application这个类,这个类是在AndroidManifest.xml文件里其实是默认的 android:icon="@drawable/ic_launcher" android:label="@string/app_name" &gt; android:name="....

    Android移动应用开发实验指导书.docx.docx

    任务 1、请在AndroidManifest.xml文件中配置SecondActivity: 配置Intent的Action属性为com.sise.intent.action.JHY_ACTION; 配置Category属性为com.sise.intent.category.JHY_CATEGORY。 通过隐式Intent的使用从...

    LoginTest:使用 Robotium 测试 android 应用程序的登录页面(无后端)

    登录测试使用 Robotium 测试 android 应用程序的登录页面(无后端) 我创建了一个... AndroidManifest.xml、ApplicationTest.java 和 build.gradle (LoginTest/app/build.gradle) 文件对于理解这个演示非常有用和重要。

    Android移动应用开发实验指导书.docx

    任务 1、请在AndroidManifest.xml文件中配置SecondActivity: 配置Intent的Action属性为com.sise.intent.action.JHY_ACTION; 配置Category属性为com.sise.intent.category.JHY_CATEGORY。 通过隐式Intent的使用从...

    android实习报告(1).doc

    当新建一个Android Project后可以 看到在工程文件下的src中有一个已建好的java类FirstActivity,系统也会自动为他配 备一个布局文件main.xml ,并在AndroidManifest中对此Activity进行注册。 用户想要自己创建一个...

    疯狂Android讲义.part2

    6.5.2 使用原始XML文件 237 6.6 使用布局(Layout)资源 239 6.7 使用菜单(Menu)资源 239 6.7.1 定义菜单资源 239 6.7.2 使用菜单资源 240 6.8 样式(Style)和主题(Theme) 资源 243 6.8.1 样式资源 243 6.8.2 ...

    疯狂Android讲义.part1

    6.5.2 使用原始XML文件 237 6.6 使用布局(Layout)资源 239 6.7 使用菜单(Menu)资源 239 6.7.1 定义菜单资源 239 6.7.2 使用菜单资源 240 6.8 样式(Style)和主题(Theme) 资源 243 6.8.1 样式资源 243 6.8.2 ...

Global site tag (gtag.js) - Google Analytics