AndroidManifest.xml配置文件解析

李兆奇

李兆奇

2016-02-19 11:18

关注图老师设计创意栏目可以让大家能更好的了解电脑,知道有关于电脑的更多有趣教程,今天给大家分享AndroidManifest.xml配置文件解析教程,希望对大家能有一点小小的帮助。
AndroidManifest.xml配置文件对于Android应用开发来说是非常重要的基础知识,本文旨在总结该配置文件中重点的用法,以便日后查阅。下面是一个标准的AndroidManifest.xml文件样例。
代码如下:

?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 配置 --
activity
intent-filter
action /
category /
data /
/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 配置 --
receiver
intent-filter . . . /intent-filter
meta-data /
/receiver
!-- Provider 配置 --
provider
grant-uri-permission /
meta-data /
/provider
!-- 所需类库配置 --
uses-library /
/application
/manifest

从以上示例代码中,我们可以看出Android配置文件采用XML作为描述语言,每个XML标签都不同的含义,大部分的配置参数都放在标签的属性中,下面我们便按照以上配置文件样例中的先后顺序来学习Android配置文件中主要元素与标签的用法。
manifest
AndroidManifest.xml配置文件的根元素,必须包含一个application元素并且指定xlmns:android和package属性。xlmns:android指定了Android的命名空间,默认情况下是“http://schemas.android.com/apk/res/android”;而package是标准的应用包名,也是一个应用进程的默认名称,以本书微博应用实例中的包名为例,即“com.app.demos”就是一个标准的Java应用包名,我们为了避免命名空间的冲突,一般会以应用的域名来作为包名。当然还有一些其他常用的属性需要注意一下,比如android:versionCode是给设备程序识别版本用的,必须是一个整数值代表app更新过多少次;而android:versionName则是给用户查看版本用的,需要具备一定的可读性,比如“1.0.0”这样的。manifest标签语法范例如下。
manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="string"
android:sharedUserId="string"
android:sharedUserLabel="string resource"
android:versionCode="integer"
android:versionName="string"
android:installLocation=["auto" | "internalOnly" | "preferExternal"]
... ...
/manifest
uses-permission
为了保证Android应用的安全性,应用框架制定了比较严格的权限系统,一个应用必须声明了正确的权限才可以使用相应的功能,例如我们需要让应用能够访问网络就需要配置“android.permission.INTERNET”,而如果要使用设备的相机功能,则需要设置“android.permission.CAMERA”等。uses-permission就是我们最经常使用的权限设定标签,我们通过设定android:name属性来声明相应的权限名,比如在微博应用实例中,我们就是根据应用的所需功能声明了对应的权限,相关代码如下。
manifest ...
... ...
!-- 网络相关功能 --
uses-permission android:name="android.permission.INTERNET" /
uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /
uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /
uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /
!-- 读取电话状态 --
uses-permission android:name="android.permission.READ_PHONE_STATE"/
!-- 通知相关功能 --
uses-permission android:name="android.permission.VIBRATE" /
... ...
/manifest
permission
权限声明标签,定义了供给uses-permission使用的具体权限,通常情况下我们不需要为自己的应用程序声明某个权限,除非需要给其他应用程序提供可调用的代码或者数据,这个时候你才需要使用permission标签。该标签中提供了android:name权限名标签,权限图标android:icon以及权限描述android:description等属性,另外还可以和permission-group以及permission-tree配合使用来构造更有层次的、更有针对性权限系统。permission标签语法范例如下。
permission android:description="string resource"
android:icon="drawable resource"
android:label="string resource"
android:name="string"
android:permissionGroup="string"
android:protectionLevel=["normal" | "dangerous" | "signature" | "signatureOrSystem"] /
instrumentation
用于声明Instrumentation测试类来监控Android应用的行为并应用到相关的功能测试中,其中比较重要的属性有:测试功能开关android:functionalTest,profiling调试功能开关android:handleProfiling,测试用例目标对象android:targetPackage等。另外,我们需要注意的是Instrumentation对象是在应用程序的组件之前被实例化的,这点在组织测试逻辑的时候需要被考虑到。instrumentation标签语法范例如下。
instrumentation android:functionalTest=["true" | "false"]
android:handleProfiling=["true" | "false"]
android:icon="drawable resource"
android:label="string resource"
android:name="string"
android:targetPackage="string" /
uses-sdk
用于指定Android应用中所需要使用的SDK的版本,比如我们的应用必须运行于Android 2.0以上版本的系统SDK之上,那么就需要指定应用支持最小的SDK版本数为5;当然,每个SDK版本都会有指定的整数值与之对应,比如我们最常用的Android 2.2.x的版本数是8。当然,除了可以指定最低版本之外,uses-sdk标签还可以指定最高版本和目标版本,语法范例如下。
uses-sdk android:minSdkVersion="integer"
android:targetSdkVersion="integer"
android:maxSdkVersion="integer" /
uses-configuration与uses-feature
这两个标签都是用于描述应用所需要的硬件和软件特性,以便防止应用在没有这些特性的设备上安装。uses-configuration标签中,比如有些设备带有D-pad或者Trackball这些特殊硬件,那么android:reqFiveWayNav属性就需要设置为true;而如果有一些设备带有硬件键盘,android:reqHardKeyboard也需要被设置为true。另外,如果设备需要支持蓝牙,我们可以使用uses-feature android:name="android.hardware.bluetooth" /来支持这个功能。这两个标签主要用于支持一些特殊的设备中的应用,两个标签的语法范例分别如下。
uses-configuration android:reqFiveWayNav=["true" | "false"]
android:reqHardKeyboard=["true" | "false"]
android:reqKeyboardType=["undefined" | "nokeys" | "qwerty" | "twelvekey"]
android:reqNavigation=["undefined" | "nonav" | "dpad" | "trackball" | "wheel"]
android:reqTouchScreen=["undefined" | "notouch" | "stylus" | "finger"] /
uses-feature android:name="string"
android:required=["true" | "false"]
android:glEsVersion="integer" /
uses-library
用于指定Android应用可使用的用户库,除了系统自带的android.app、android.content、android.view和android.widget这些默认类库之外,有些应用可能还需要一些其他的Java类库作为支持,这种情况下我们就可以使用uses-library标签让ClassLoader加载其类库供Android应用运行时用。uses-library标签的用法很简单,以下是语法范例。
uses-library android:name="string"
android:required=["true" | "false"] /
小贴士
当运行Java程序时,首先运行JVM(Java虚拟机),然后再把Java类加载到JVM里头运行,负责加载Java类的这部分就叫做ClassLoader。当然,ClassLoader是由多个部分构成的,每个部分都负责相应的加载工作。当运行一个程序的时候,JVM启动,运行BootstrapClassLoader,该ClassLoader加载java核心API(ExtClassLoader和AppClassLoader也在此时被加载),然后调用ExtClassLoader加载扩展API,最后AppClassLoader加载CLASSPATH目录下定义的Class,这就是一个Java程序最基本的加载流程。
supports-screens
对于一些应用或者游戏来说,只能支持某些屏幕大小的设备或者在某些设备中的效果比较好,我们就会使用supports-screens标签来指定支持的屏幕特征。其中比较重要的属性包括:屏幕自适应属性android:resizeable,小屏(android:smallScreens)、中屏(android:normalScreens)、大屏(android:largeScreens)和特大屏(android:xlargeScreens)支持属性,按屏幕渲染图像属性android:anyDensity以及最小屏幕宽度属性android:requiresSmallestWidthDp等。supports-screens标签的语法范例如下。
supports-screens android:resizeable=["true"| "false"]
android:smallScreens=["true" | "false"]
android:normalScreens=["true" | "false"]
android:largeScreens=["true" | "false"]
android:xlargeScreens=["true" | "false"]
android:anyDensity=["true" | "false"]
android:requiresSmallestWidthDp="integer"
android:compatibleWidthLimitDp="integer"
android:largestWidthLimitDp="integer"/
application
应用配置的根元素,位于manifest下层,包含所有与应用有关配置的元素,其属性可以作为子元素的默认属性,常用的属性包括:应用名android:label,应用图标android:icon,应用主题android:theme等。当然,application标签还提供了其他丰富的配置属性,由于篇幅原因就不列举了,大家可以打开Android SDK文档来进一步学习,以下是语法范例。
application android:allowTaskReparenting=["true" | "false"]
android:backupAgent="string"
android:debuggable=["true" | "false"]
android:description="string resource"
android:enabled=["true" | "false"]
android:hasCode=["true" | "false"]
android:hardwareAccelerated=["true" | "false"]
android:icon="drawable resource"
android:killAfterRestore=["true" | "false"]
android:label="string resource"
android:logo="drawable resource"
android:manageSpaceActivity="string"
android:name="string"
android:permission="string"
android:persistent=["true" | "false"]
android:process="string"
android:restoreAnyVersion=["true" | "false"]
android:taskAffinity="string"
android:theme="resource or theme"
... ...
/application
activity
Activity活动组件(即界面控制器组件)的声明标签,Android应用中的每一个Activity都必须在AndroidManifest.xml配置文件中声明,否则系统将不识别也不执行该Activity。activity标签中常用的属性有:Activity对应类名android:name,对应主题android:theme,加载模式android:launchMode(详见2.1.3.4节),键盘交互模式android:windowSoftInputMode等,其他的属性用法大家可以参考Android SDK文档学习。另外,activity标签还可以包含用于消息过滤的intent-filter元素,当然还有可用于存储预定义数据的meta-data元素,以下是activity标签的语法范例。
activity android:allowTaskReparenting=["true" | "false"]
android:alwaysRetainTaskState=["true" | "false"]
android:clearTaskOnLaunch=["true" | "false"]
android:configChanges=["mcc", "mnc", "locale",
"touchscreen", "keyboard", "keyboardHidden",
"navigation", "orientation", "screenLayout",
"fontScale", "uiMode"]
android:enabled=["true" | "false"]
android:excludeFromRecents=["true" | "false"]
android:exported=["true" | "false"]
android:finishOnTaskLaunch=["true" | "false"]
android:hardwareAccelerated=["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" | "nosensor"]
android:stateNotNeeded=["true" | "false"]
android:taskAffinity="string"
android:theme="resource or theme"
android:windowSoftInputMode=["stateUnspecified",
"stateUnchanged", "stateHidden",
"stateAlwaysHidden", "stateVisible",
"stateAlwaysVisible", "adjustUnspecified",
"adjustResize", "adjustPan"]
... ...
/activity
activity-alias
Activity组件别名的声明标签,简单来说就是Activity的快捷方式,属性android:targetActivity表示的就是其相关的Activity名,当然必须是前面已经声明过的Activity。除此之外,其他比较常见的属性有:Activity别名名称android:name,别名开关android:enabled,权限控制android:permission等。另外,我们还需要注意的是,Activity别名也是一个独立的Activity,可以拥有自己的intent-filter和meta-data元素,其语法范例如下。
activity-alias android:enabled=["true" | "false"]
android:exported=["true" | "false"]
android:icon="drawable resource"
android:label="string resource"
android:name="string"
android:permission="string"
android:targetActivity="string"
... ...
/activity-alias
intent-filter与action、category、data
intent-filter用于Intent消息过滤器的声明,在前面的2.1.3.2节中我们已经对Android应用框架中的Intent消息作过比较详细的介绍,我们了解到Intent消息对于Android应用系统来说,是非常重要的“粘合剂”,intent-filter元素可以放在activity、activity-alias、service和receiver元素标签中,来区分可用于处理消息的Activity控制器、Service服务和广播接收器Broadcast Receiver。另外,我们还知道Intent消息还包含有名称、动作、数据、类别等几个重要属性。这点与该标签的写法也有一定的关系,比如intent-filter中必须包含有action元素,即用于描述具体消息的名称;category标签则用于表示能处理消息组件的类别,即该Action所符合的类别;而data元素则用于描述消息需要处理的数据格式,我们甚至还可以使用正则表达式来限定数据
展开更多 50%)
分享

猜你喜欢

AndroidManifest.xml配置文件解析

编程语言 网络编程
AndroidManifest.xml配置文件解析

Nginx 配置文件解析

服务器
Nginx 配置文件解析

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

JAVA高手解析XML配置文件的读取操作

编程语言 网络编程
JAVA高手解析XML配置文件的读取操作

Linux系统启动引导程序配置文件解析

Linux Linux命令 Linux安装 Linux编程 Linux桌面 Linux软件 Linux内核 Linux管理
Linux系统启动引导程序配置文件解析

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

squid的配置文件

Linux Linux命令 Linux安装 Linux编程 Linux桌面 Linux软件 Linux内核 Linux管理
squid的配置文件

利用Jakarta Commons Digester匹配xml配置文件信息与其对应的xml

编程语言 网络编程
利用Jakarta Commons Digester匹配xml配置文件信息与其对应的xml

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

android viewpaper实例探讨

android viewpaper实例探讨

HTML5之SVG 2D入门7—SVG元素的重用与引用

HTML5之SVG 2D入门7—SVG元素的重用与引用
下拉加载更多内容 ↓