AndroidManifest.xml配置文件对于Android应用开发来说是非常重要的基础知识,本文旨在总结该配置文件中重点的用法,以便日后查阅。下面是一个标准的AndroidManifest.xml文件样例。 从以上示例代码中,我们可以看出Android配置文件采用XML作为描述语言,每个XML标签都不同的含义,大部分的配置参数都放在标签的属性中,下面我们便按照以上配置文件样例中的先后顺序来学习Android配置文件中主要元素与标签的用法。 AndroidManifest.xml配置文件的根元素,必须包含一个 android:sharedUserId='string' android:sharedUserLabel='string resource' android:versionCode='integer' android:versionName='string' android:installLocation=['auto' | 'internalOnly' | 'preferExternal'] > ... ... 为了保证Android应用的安全性,应用框架制定了比较严格的权限系统,一个应用必须声明了正确的权限才可以使用相应的功能,例如我们需要让应用能够访问网络就需要配置“android.permission.INTERNET”,而如果要使用设备的相机功能,则需要设置“android.permission.CAMERA”等。 ... ... ... ... 权限声明标签,定义了供给 android:label='string resource' android:name='string' android:permissionGroup='string' android:protectionLevel=['normal' | 'dangerous' | 'signature' | 'signatureOrSystem'] /> 用于声明Instrumentation测试类来监控Android应用的行为并应用到相关的功能测试中,其中比较重要的属性有:测试功能开关android:functionalTest,profiling调试功能开关android:handleProfiling,测试用例目标对象android:targetPackage等。另外,我们需要注意的是Instrumentation对象是在应用程序的组件之前被实例化的,这点在组织测试逻辑的时候需要被考虑到。 android:icon='drawable resource' android:label='string resource' android:name='string' android:targetPackage='string' /> 用于指定Android应用中所需要使用的SDK的版本,比如我们的应用必须运行于Android 2.0以上版本的系统SDK之上,那么就需要指定应用支持最小的SDK版本数为5;当然,每个SDK版本都会有指定的整数值与之对应,比如我们最常用的Android 2.2.x的版本数是8。当然,除了可以指定最低版本之外, android:maxSdkVersion='integer' /> 这两个标签都是用于描述应用所需要的硬件和软件特性,以便防止应用在没有这些特性的设备上安装。 android:reqKeyboardType=['undefined' | 'nokeys' | 'qwerty' | 'twelvekey'] android:reqNavigation=['undefined' | 'nonav' | 'dpad' | 'trackball' | 'wheel'] android:reqTouchScreen=['undefined' | 'notouch' | 'stylus' | 'finger'] /> android:glEsVersion='integer' /> 用于指定Android应用可使用的用户库,除了系统自带的android.app、android.content、android.view和android.widget这些默认类库之外,有些应用可能还需要一些其他的Java类库作为支持,这种情况下我们就可以使用 小贴士: 当运行Java程序时,首先运行JVM(Java虚拟机),然后再把Java类加载到JVM里头运行,负责加载Java类的这部分就叫做ClassLoader。当然,ClassLoader是由多个部分构成的,每个部分都负责相应的加载工作。当运行一个程序的时候,JVM启动,运行BootstrapClassLoader,该ClassLoader加载java核心API(ExtClassLoader和AppClassLoader也在此时被加载),然后调用ExtClassLoader加载扩展API,最后AppClassLoader加载CLASSPATH目录下定义的Class,这就是一个Java程序最基本的加载流程。 对于一些应用或者游戏来说,只能支持某些屏幕大小的设备或者在某些设备中的效果比较好,我们就会使用 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'/> 应用配置的根元素,位于 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' > ... ... Activity活动组件(即界面控制器组件)的声明标签,Android应用中的每一个Activity都必须在AndroidManifest.xml配置文件中声明,否则系统将不识别也不执行该Activity。 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'] > ... ... android:icon='drawable resource' android:label='string resource' android:name='string' android:permission='string' android:targetActivity='string' > ... ... android:priority='integer' > android:mimeType='string' android:path='string' android:pathPattern='string' android:pathPrefix='string' android:port='string' android:scheme='string' /> 用于存储预定义数据,和 ActivityInfo info = this.getPackageManager() .getActivityInfo(getComponentName(), PackageManager.GET_META_DATA); String testData = info.metaData.getString('testData'); System.out.println('testData:' + testData); Service服务组件的声明标签,用于定义与描述一个具体的Android服务,主要属性有:Service服务类名android:name,服务图标android:icon,服务描述android:label以及服务开关android:enabled等。关于Service服务组件的概念和用法请参考2.1.4.2节的内容,以下是 android:icon='drawable resource' android:label='string resource' android:name='string' android:permission='string' android:process='string' > ... ... Boardcast Receiver广播接收器组件的声明标签,用于定义与描述一个具体的Android广播接收器,其主要属性和 android:icon='drawable resource' android:label='string resource' android:name='string' android:permission='string' android:process='string' > ... ... 除Activity、Service和Boardcast Receiver之外的另一个“四大组件”,也就是Content Provider内容提供者的声明标签。关于内容提供者组件的概念和用法请参考2.1.4.4节的内容,不再赘述。 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' > ... ... |
|