AndroidManifest.xml配置文件解析
程序员文章站
2023-12-04 11:20:16
androidmanifest.xml配置文件对于android应用开发来说是非常重要的基础知识,本文旨在总结该配置文件中重点的用法,以便日后查阅。下面是一个标准的andr...
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>元素则用于描述消息需要处理的数据格式,我们甚至还可以使用正则表达式来限定数据来源。当然,这些元素和标签的具体用法我们还需要慢慢学习,下面是标准<intent-filter>元素标签的语法范例。
<intent-filter android:icon="drawable resource"
android:label="string resource"
android:priority="integer" >
<action android:name="string" />
<category android:name="string" />
<data android:host="string"
android:mimetype="string"
android:path="string"
android:pathpattern="string"
android:pathprefix="string"
android:port="string"
android:scheme="string" />
</intent-filter>
<meta-data>
用于存储预定义数据,和<intent-filter>类似,<meta-data>也可以放在<activity>、<activity-alias>、<service>和<receiver>这四个元素标签中。meta数据一般会以键值对的形式出现,个数没有限制,而这些数据都将被放到一个bundle对象中,程序中我们则可以使用activityinfo、serviceinfo甚至applicationinfo对象的metadata属性中读取。假设我们在一个activity中定义了一个<meta-data>元素,相关示例用法如下。
<activity...>
<meta-data android:name="testdata" android:value="test meta data"></meta-data>
</activity>
activityinfo info = this.getpackagemanager()
.getactivityinfo(getcomponentname(), packagemanager.get_meta_data);
string testdata = info.metadata.getstring("testdata");
system.out.println("testdata:" + testdata);
<service>
service服务组件的声明标签,用于定义与描述一个具体的android服务,主要属性有:service服务类名android:name,服务图标android:icon,服务描述android:label以及服务开关android:enabled等。关于service服务组件的概念和用法请参考2.1.4.2节的内容,以下是<service>标签的语法范例。
<service android:enabled=["true" | "false"]
android:exported=["true" | "false"]
android:icon="drawable resource"
android:label="string resource"
android:name="string"
android:permission="string"
android:process="string" >
... ...
</service>
<receiver>
boardcast receiver广播接收器组件的声明标签,用于定义与描述一个具体的android广播接收器,其主要属性和<service>标签有些类似:boardcast receiver接收器类名android:name,接收器图标android:icon,接收器描述android:label以及接收器开关android:enabled等。关于boardcast receiver广播接收器组件的概念和用法请参考2.1.4.3节的内容,以下是<receiver>标签的语法范例。
<receiver android:enabled=["true" | "false"]
android:exported=["true" | "false"]
android:icon="drawable resource"
android:label="string resource"
android:name="string"
android:permission="string"
android:process="string" >
... ...
</receiver>
<provider>与<grant-uri-permission>
除activity、service和boardcast receiver之外的另一个“四大组件”,也就是content provider内容提供者的声明标签。关于内容提供者组件的概念和用法请参考2.1.4.4节的内容,不再赘述。<provider>标签除了和其他组件相同的android:name、android:icon和android:label等基础属性之外,还提供了用于支持其功能的特殊属性,如:内容提供者标识名称android:authorities,对指定uri授予权限标识android:granturipermission以及具体的读、写权限,即android:readpermission和android:writepermission等。当然,这些属性的具体用法我们还需要慢慢学习,以下是<provider>标签的语法范例。
<provider android:authorities="list"
android:enabled=["true" | "false"]
android:exported=["true" | "false"]
android:granturipermissions=["true" | "false"]
android:icon="drawable resource"
android:initorder="integer"
android:label="string resource"
android:multiprocess=["true" | "false"]
android:name="string"
android:permission="string"
android:process="string"
android:readpermission="string"
android:syncable=["true" | "false"]
android:writepermission="string" >
... ...
</provider>
补充:本站还提供了一个关于android manifest功能与权限的在线查询表供大家参考查询:
android manifest功能与权限描述大全:
上一篇: HTML5中drawImage用法分析
下一篇: mysql LOAD语句批量录入数据