免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1618 | 回复: 2
打印 上一主题 下一主题

[Android] AndroidManifest.xml配置 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-06-11 09:36 |只看该作者 |倒序浏览
AndroidManifest.xml配置文件对于Android应用开发来说是非常重要的基础知识,本文旨在总结该配置文件中重点的用法,以便日后查阅。下面是一个标准的AndroidManifest.xml文件样例。
[html] view plaincopy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2.   
  3. <manifest>  
  4.   
  5.     <!-- 基本配置 -->  
  6.     <uses-permission />  
  7.     <permission />  
  8.     <permission-tree />  
  9.     <permission-group />  
  10.     <instrumentation />  
  11.     <uses-sdk />  
  12.     <uses-configuration />  
  13.     <uses-feature />  
  14.     <supports-screens />  
  15.     <compatible-screens />  
  16.     <supports-gl-texture />  
  17.       
  18.     <!-- 应用配置 -->  
  19.     <application>  
  20.          
  21.         <!-- Activity 配置 -->  
  22.         <activity>  
  23.             <intent-filter>  
  24.                 <action />  
  25.                 <category />  
  26.                 <data />  
  27.             </intent-filter>  
  28.             <meta-data />  
  29.         </activity>  
  30.          
  31.         <activity-alias>  
  32.             <intent-filter> . . . </intent-filter>  
  33.             <meta-data />  
  34.         </activity-alias>  
  35.          
  36.         <!-- Service 配置 -->  
  37.         <service>  
  38.             <intent-filter> . . . </intent-filter>  
  39.             <meta-data/>  
  40.         </service>  
  41.          
  42.         <!-- Receiver 配置 -->  
  43.         <receiver>  
  44.             <intent-filter> . . . </intent-filter>  
  45.             <meta-data />  
  46.         </receiver>  
  47.          
  48.         <!-- Provider 配置 -->  
  49.         <provider>  
  50.             <grant-uri-permission />  
  51.             <meta-data />  
  52.         </provider>  
  53.          
  54.         <!-- 所需类库配置 -->  
  55.         <uses-library />  
  56.   
  57.     </application>  
  58.   
  59. </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>标签语法范例如下。
  1. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  2.     package="string"
  3.     android:sharedUserId="string"
  4.     android:sharedUserLabel="string resource"
  5.     android:versionCode="integer"
  6.     android:versionName="string"
  7.     android:installLocation=["auto" | "internalOnly" | "preferExternal"] >
  8. ... ...
  9. </manifest>
复制代码
<uses-permission>
为了保证Android应用的安全性,应用框架制定了比较严格的权限系统,一个应用必须声明了正确的权限才可以使用相应的功能,例如我们需要让应用能够访问网络就需要配置“android.permission.INTERNET”,而如果要使用设备的相机功能,则需要设置“android.permission.CAMERA”等。<uses-permission>就是我们最经常使用的权限设定标签,我们通过设定android:name属性来声明相应的权限名,比如在微博应用实例中,我们就是根据应用的所需功能声明了对应的权限,相关代码如下。
  1. <manifest ...>
  2. ... ...
  3.     <!-- 网络相关功能 -->
  4.     <uses-permission android:name="android.permission.INTERNET" />
  5.     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  6.     <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
  7.     <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
  8.     <!-- 读取电话状态 -->
  9.     <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
  10.     <!-- 通知相关功能 -->
  11.     <uses-permission android:name="android.permission.VIBRATE" />
  12. ... ...
  13. </manifest>
复制代码
<permission>

权限声明标签,定义了供给<uses-permission>使用的具体权限,通常情况下我们不需要为自己的应用程序声明某个权限,除非需要给其他应用程序提供可调用的代码或者数据,这个时候你才需要使用<permission>标签。该标签中提供了android:name权限名标签,权限图标android:icon以及权限描述android:description等属性,另外还可以和<permission-group>以及<permission-tree>配合使用来构造更有层次的、更有针对性权限系统。<permission>标签语法范例如下。
  1. <permission android:description="string resource"
  2.     android:icon="drawable resource"
  3.     android:label="string resource"
  4.     android:name="string"
  5.     android:permissionGroup="string"
  6.     android:protectionLevel=["normal" | "dangerous" | "signature" | "signatureOrSystem"] />
复制代码
<instrumentation>

用于声明Instrumentation测试类来监控Android应用的行为并应用到相关的功能测试中,其中比较重要的属性有:测试功能开关android:functionalTest,profiling调试功能开关android:handleProfiling,测试用例目标对象android:targetPackage等。另外,我们需要注意的是Instrumentation对象是在应用程序的组件之前被实例化的,这点在组织测试逻辑的时候需要被考虑到。<instrumentation>标签语法范例如下。
  1. <instrumentation android:functionalTest=["true" | "false"]
  2.     android:handleProfiling=["true" | "false"]
  3.     android:icon="drawable resource"
  4.     android:label="string resource"
  5.     android:name="string"
  6.     android:targetPackage="string" />
复制代码
<uses-sdk>

用于指定Android应用中所需要使用的SDK的版本,比如我们的应用必须运行于Android 2.0以上版本的系统SDK之上,那么就需要指定应用支持最小的SDK版本数为5;当然,每个SDK版本都会有指定的整数值与之对应,比如我们最常用的Android 2.2.x的版本数是8。当然,除了可以指定最低版本之外,<uses-sdk>标签还可以指定最高版本和目标版本,语法范例如下。
  1. <uses-sdk android:minSdkVersion="integer"
  2.     android:targetSdkVersion="integer"
  3.     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" />来支持这个功能。这两个标签主要用于支持一些特殊的设备中的应用,两个标签的语法范例分别如下。
  1. <uses-configuration android:reqFiveWayNav=["true" | "false"]
  2.     android:reqHardKeyboard=["true" | "false"]
  3.     android:reqKeyboardType=["undefined" | "nokeys" | "qwerty" | "twelvekey"]
  4.     android:reqNavigation=["undefined" | "nonav" | "dpad" | "trackball" | "wheel"]
  5.     android:reqTouchScreen=["undefined" | "notouch" | "stylus" | "finger"] />

  6. <uses-feature android:name="string"
  7.     android:required=["true" | "false"]
  8.     android:glEsVersion="integer" />
复制代码
<uses-library>

用于指定Android应用可使用的用户库,除了系统自带的android.app、android.content、android.view和android.widget这些默认类库之外,有些应用可能还需要一些其他的Java类库作为支持,这种情况下我们就可以使用<uses-library>标签让ClassLoader加载其类库供Android应用运行时用。<uses-library>标签的用法很简单,以下是语法范例。
  1. <uses-library android:name="string"
  2.     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)和特大屏(androidlargeScreens)支持属性,按屏幕渲染图像属性android:anyDensity以及最小屏幕宽度属性android:requiresSmallestWidthDp等。<supports-screens>标签的语法范例如下。
  1. <supports-screens android:resizeable=["true"| "false"]
  2.     android:smallScreens=["true" | "false"]
  3.     android:normalScreens=["true" | "false"]
  4.     android:largeScreens=["true" | "false"]
  5.     android:xlargeScreens=["true" | "false"]
  6.     android:anyDensity=["true" | "false"]
  7.     android:requiresSmallestWidthDp="integer"
  8.     android:compatibleWidthLimitDp="integer"
  9.     android:largestWidthLimitDp="integer"/>
复制代码
<application>

应用配置的根元素,位于<manifest>下层,包含所有与应用有关配置的元素,其属性可以作为子元素的默认属性,常用的属性包括:应用名android:label,应用图标android:icon,应用主题android:theme等。当然,<application>标签还提供了其他丰富的配置属性,由于篇幅原因就不列举了,大家可以打开Android SDK文档来进一步学习,以下是语法范例。
  1. <application android:allowTaskReparenting=["true" | "false"]
  2.     android:backupAgent="string"
  3.     android:debuggable=["true" | "false"]
  4.     android:description="string resource"
  5.     android:enabled=["true" | "false"]
  6.     android:hasCode=["true" | "false"]
  7.     android:hardwareAccelerated=["true" | "false"]
  8.     android:icon="drawable resource"
  9.     android:killAfterRestore=["true" | "false"]
  10.     android:label="string resource"
  11.     android:logo="drawable resource"
  12.     android:manageSpaceActivity="string"
  13.     android:name="string"
  14.     android:permission="string"
  15.     android:persistent=["true" | "false"]
  16.     android:process="string"
  17.     android:restoreAnyVersion=["true" | "false"]
  18.     android:taskAffinity="string"
  19.     android:theme="resource or theme" >
  20. ... ...
  21. </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>标签的语法范例。
  1. <activity android:allowTaskReparenting=["true" | "false"]
  2.     android:alwaysRetainTaskState=["true" | "false"]
  3.     android:clearTaskOnLaunch=["true" | "false"]
  4.     android:configChanges=["mcc", "mnc", "locale",
  5.         "touchscreen", "keyboard", "keyboardHidden",
  6.         "navigation", "orientation", "screenLayout",
  7.         "fontScale", "uiMode"]
  8.     android:enabled=["true" | "false"]
  9.     android:excludeFromRecents=["true" | "false"]
  10.     android:exported=["true" | "false"]
  11.     android:finishOnTaskLaunch=["true" | "false"]
  12.     android:hardwareAccelerated=["true" | "false"]
  13.     android:icon="drawable resource"
  14.     android:label="string resource"
  15.     android:launchMode=["multiple" | "singleTop" | "singleTask" | "singleInstance"]
  16.     android:multiprocess=["true" | "false"]
  17.     android:name="string"
  18.     android:noHistory=["true" | "false"]  
  19.     android:permission="string"
  20.     android:process="string"
  21.     android:screenOrientation=["unspecified" | "user" | "behind" |
  22.         "landscape" | "portrait" |
  23.         "sensor" | "nosensor"]
  24.     android:stateNotNeeded=["true" | "false"]
  25.     android:taskAffinity="string"
  26.     android:theme="resource or theme"
  27.     android:windowSoftInputMode=["stateUnspecified",
  28.         "stateUnchanged", "stateHidden",
  29.         "stateAlwaysHidden", "stateVisible",
  30.         "stateAlwaysVisible", "adjustUnspecified",
  31.         "adjustResize", "adjustPan"] >   
  32. ... ...
  33. </activity>
复制代码
<activity-alias>

Activity组件别名的声明标签,简单来说就是Activity的快捷方式,属性android:targetActivity表示的就是其相关的Activity名,当然必须是前面已经声明过的Activity。除此之外,其他比较常见的属性有:Activity别名名称android:name,别名开关android:enabled,权限控制android:permission等。另外,我们还需要注意的是,Activity别名也是一个独立的Activity,可以拥有自己的<intent-filter>和<meta-data>元素,其语法范例如下。
  1. <activity-alias 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:targetActivity="string" >
  8. ... ...
  9. </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>元素标签的语法范例。
  1. <intent-filter android:icon="drawable resource"
  2.     android:label="string resource"
  3.     android:priority="integer" >
  4.     <action android:name="string" />
  5.     <category android:name="string" />
  6.     <data android:host="string"
  7.         android:mimeType="string"
  8.         android:path="string"
  9.         android:pathPattern="string"
  10.         android:pathPrefix="string"
  11.         android:port="string"
  12.         android:scheme="string" />
  13. </intent-filter>
复制代码
<meta-data>

用于存储预定义数据,和<intent-filter>类似,<meta-data>也可以放在<activity>、<activity-alias>、<service>和<receiver>这四个元素标签中。Meta数据一般会以键值对的形式出现,个数没有限制,而这些数据都将被放到一个Bundle对象中,程序中我们则可以使用ActivityInfo、ServiceInfo甚至ApplicationInfo对象的metaData属性中读取。假设我们在一个Activity中定义了一个<meta-data>元素,相关示例用法如下。
  1. <activity...>
  2.     <meta-data android:name="testData" android:value="Test Meta Data"></meta-data>
  3. </activity>

  4. ActivityInfo info = this.getPackageManager()
  5.     .getActivityInfo(getComponentName(), PackageManager.GET_META_DATA);
  6. String testData = info.metaData.getString("testData");
  7. System.out.println("testData:" + testData);
复制代码
<service>

Service服务组件的声明标签,用于定义与描述一个具体的Android服务,主要属性有:Service服务类名android:name,服务图标android:icon,服务描述android:label以及服务开关android:enabled等。关于Service服务组件的概念和用法请参考2.1.4.2节的内容,以下是<service>标签的语法范例。
  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. ... ...
  9. </service>
复制代码
<receiver>

Boardcast Receiver广播接收器组件的声明标签,用于定义与描述一个具体的Android广播接收器,其主要属性和<service>标签有些类似:Boardcast Receiver接收器类名android:name,接收器图标android:icon,接收器描述android:label以及接收器开关android:enabled等。关于Boardcast Receiver广播接收器组件的概念和用法请参考2.1.4.3节的内容,以下是<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. ... ...
  9. </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>标签的语法范例。
  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. ... ...
复制代码

论坛徽章:
59
2015七夕节徽章
日期:2015-08-24 11:17:25ChinaUnix专家徽章
日期:2015-07-20 09:19:30每周论坛发贴之星
日期:2015-07-20 09:19:42ChinaUnix元老
日期:2015-07-20 11:04:38荣誉版主
日期:2015-07-20 11:05:19巳蛇
日期:2015-07-20 11:05:26CU十二周年纪念徽章
日期:2015-07-20 11:05:27IT运维版块每日发帖之星
日期:2015-07-20 11:05:34操作系统版块每日发帖之星
日期:2015-07-20 11:05:36程序设计版块每日发帖之星
日期:2015-07-20 11:05:40数据库技术版块每日发帖之星
日期:2015-07-20 11:05:432015年辞旧岁徽章
日期:2015-07-20 11:05:44
2 [报告]
发表于 2015-07-02 09:11 |只看该作者
这个配置文件很重要,好多权限什么的都在这里。

论坛徽章:
80
20周年集字徽章-庆
日期:2020-10-28 14:09:1215-16赛季CBA联赛之北京
日期:2020-10-28 13:32:5315-16赛季CBA联赛之北控
日期:2020-10-28 13:32:4815-16赛季CBA联赛之天津
日期:2020-10-28 13:13:35黑曼巴
日期:2020-10-28 12:29:1520周年集字徽章-周	
日期:2020-10-31 15:10:0720周年集字徽章-20	
日期:2020-10-31 15:10:07ChinaUnix元老
日期:2015-09-29 11:56:3020周年集字徽章-年
日期:2020-10-28 14:14:56
3 [报告]
发表于 2015-07-22 16:42 |只看该作者
太详细了      
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP