在开发一个Android项目时少不了对AndroidManifest.xml这个文件的修改。那么这个文件到底有什么样的功能在里面呢?我们下面讲解下。
1:manifest
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.padd.myapp"
android:versionCode="1"
android:versionName="1.0"
android:installLocation="auto"
>
android:versionCode="1" 将当前应用程序版本定义为一个整数,每次版本迭代时,这个数字都会增加
android:versionName="1.0" 定义一个显示给用户的公共版本号
android:installLocation="auto" 指定应用程序是否可以安装到外部存储器上
2:uses-sdk
<uses-sdk
android:minSdkVersion="8"
android:maxSdkVersion="20"
android:targetSdkVersion="19" />
uses-sdk 这个节点用于定义要想正确地运行应用程序,设备上必须具有的最低(android:minSdkVersion)和最高(android:maxSdkVersion)SDK版本,以及应用程序设计的目标(android:targetSdkVersion)SDK。
最低SDK包含了应用程序中使用的API的最低SDK版本。若没有指定最低SDK版本,则为1。如果应用程序调用不可用的API,那么就会失败。
最高SDK版本用于定义想要支持的最高SDK版本。最好不要设置最高SDK版本,除非你知道应用程序在更新的平台版本肯定不能正确工作。
目标SDK版本属性用于指定你在开发和测试应用程序时使用的平台。设置目标SDK版本会告诉系统不需要为支持该版本而进行任何前向后向兼容性更改。为了利用最新的平台的UI改进,当确认应用程序在最新的平台版本上的表现符合预期后,即使应用程序中没有使用任何新的API,也应该将其目标SDK设为最新的平台版本。
3:uses-configuration
<uses-configuration
android:reqTouchScreen="finger"
android:reqKeyboardType="nokeys"
android:reqHardKeyboard="true"
android:reqNavigation="trackball"
android:reqFiveWayNav="true"
></uses-configuration>
uses-configuration:使用该节点可以指定应用程序支持的每个输入机制的组合。一般不需要包含这个节点,不过对于需要特殊输入控制的游戏来说,它是很有用的。可以指定以下输入设备的任意组合。
reqFiveWayNav:如果要求输入设备能够向上,向下,向左和向右导航,并且能够单击当前的选项,那么需要将这个属性指定为true。这包括跟踪球和D-pad。
reqHardKeyboard:如果应用程序需要硬件键盘,则将此属性设为true
reqKeyboardType:用于将键盘类型指定为nokeys,qwerty,twelvekey或undefined中的一种
reqNavigation:将属性指定为nonav,dpad,trackball,wheel或undefined其中之一,作为必须导航设备
reqTouchScreen:选择notouch,stylus,finger和undefined其中之一,以指定必需的触摸屏输入。
在指定必需的配置时需要注意,如果设备不具有任意一种指定配置,则应由程序将不会安装在该设备上。
4:uses-feature
<uses-feature android:name="android.hardware.nfc" android:required="false"></uses-feature>
uses-feature:Android可以在各种各样的硬件平台上运行。可以使用多个uses-feature节点来指定应用程序需要的每个硬件功能。这可以避免将应用程序安装到不包含必要的硬件功能(如NFC硬件)的设备上。
5:supports-screens
<strong> </strong> <supports-screens
android:smallScreens="true"
android:normalScreens="true"
android:largeScreens="true"
android:requiresSmallestWidthDp="480"
android:compatibleWidthLimitDp="600"
android:largestWidthLimitDp="720"
>
</supports-screens>
supports-screens:用于指定应用程序针对哪些屏幕尺寸进行了设计和测试。当应用程序支持某个设备的屏幕时,一般就会使用开发人员提供的布局文件中的缩放属性来布局。在不支持的设备上运行时,系统可能会应用“兼容模式”来显示应用程序,如像素缩放。
在描述应用程序支持的屏幕时,可以使用两套属性。第一套属性主要用于运行的Android版本早于Honeycomb MR2(API level 13)的设备。每个属性都接受一个布尔值来指定是否支持某种屏幕。从SDK1.6(API level 4)开始,每个属性的默认值都是true,所以只需要用这个节点来指定不支持的屏幕尺寸。
smallScreens:分辨率比传统的HVGA小的屏幕,通常为QVAG屏幕
normalScreens:用于指定典型的手机屏幕,至少是HVGA,包括WVGA和WQVGA
largeScreens:比普通屏幕大的屏幕。在这里,认为大屏幕比手机的显示屏大很多
Honeycomb MR2(API level 13)引入了额外的属性。
requiresSmallestWidthDp:允许用设备无关的像素指定支持的最小屏幕宽度。设备的最小屏幕宽度是其屏幕高度和宽度中较小的一个。这个属性可以用来在Google Play Store中为设备过滤掉不支持它们的屏幕的应用程序,所以在使用时应该指定为提供可以接受的用户体验,布局最小的绝对像素。
compatibleWidthLimitDp:指定一个上限,超出此值后应用程序可能无法扩展。使用该属性可以使系统在屏幕分辨率大于你指定的值的设备上启动兼容模式
largestWidthLimitDp:指定一个绝对上限,你知道在超出这个上限后应用程序将无法恰当地扩展。通常,在屏幕分辨率大于你指定的值的设备上,这会导致系统强制应用程序在兼容模式下运行(而用户无法禁用此模式)
只要有可能,就应该针对不同的屏幕分辨率和密度,使用资源文件夹优化应用程序,而不是强制使应用程序只支持一部分屏幕。
5:uses-permission
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
uses-permission:声明了应用程序需要在安装程序的时候,你设定的所有权限将会告诉用户,由他们来决定同意是否。对很多API和方法调用来说,权限都是必需的。
6:permission
<permission
android:name="com.pad.DETONATE_DEVICE"
android:protectionLevel="dangerous"
android:label="Self Destruct"
android:description="@string/app_name"
></permission>
permission:应用程序组件也可以创建权限来限制对共享应用程序组件的访问。为此目的,可以使用现有的平台权限,也可以在Manifest中定义自己的权限。
7:instrumentation
<instrumentation
android:label="MyTest"
android:name=".TestClass"
android:targetPackage="com.padd.apackage"
></instrumentation>
instrumentation:提供一个测试框架,用来在应用程序运行时测试应用程序组件。它们提供了一些挂钩来监控应用程序及其与系统资源的交互。对应为自己的应用程序创建的每一个测试类,都需要创建一个新的节点。
8:application
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
</application>
application:一个Manifest只能包含一个application节点。它用各种属性来指定应用程序的各种元数据(包括标题,图标和主题)。在开发时,应该包含一个设置为true的debuggable属性以启用调试,但是在发布时可以禁用该属性。application节点可以包含Activity,Service,Content Provider和Broadcast Receiver节点的容器。
9:activity
<activity
android:name="com.example.testjunit.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
应用程序内的每一个activity都需要有一个activity标签,并使用android:name属性来指定Activity类的名称。必须包含核心Activity和其它所有可以显示的Activity。启动一个没有在Manifest定义的activity都会抛出异常。每一个activity节点都允许使用intent-filter子标签来定义用于启动该activity的intent。
10:Service
<service android:name=".MyService"></service>
Service:需要为应用程序使用的每一个服务添加该声明。也支持使用intent-filter子标签来允许允许时迟绑定
11:provider
<provider
android:name=".MyProvider"
android:authorities="com.padd.myapp.MyProvider"
>
</provider>
provider:用来指定应用程序中的每一个Content Provider。用来管理数据库访问和共享。
12:receiver
<receiver android:name=".MyBroadcast" >
<intent-filter android:priority="100">
<action android:name="com.padd.mybroadacton" />
</intent-filter>
</receiver>
receiver:通过该标签可以注册一个Broadcast Receiver,而不用事先启动应用程序。一旦注册,无论何时,只有与它相匹配的Intent被系统或应用程序广播出来,它就会立即执行。如果一个匹配的Intent被广播了,则应用程序就会自动启动,并且你注册的Broadcast Receiver也会开始执行。每个receiver节点都允许使用intent-filter子标签来定义可以用来触发接收器的Intent。
13:uses-library
<uses-library
android:name="com.google.android.maps"
android:required="false"
>
</uses-library>
uses-library:指定应用程序需要的共享库。可以指定一个包是必须的还是可选的。指定为必须的时候,在确少指定库的设备上将无法安装应用程序。指定为可选时,应用程序在试图使用库之前,必须使用反射机制来检查该库是否存在。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.padd.myapp"
android:installLocation="auto"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:maxSdkVersion="20"
android:minSdkVersion="8"
android:targetSdkVersion="19" />
<uses-configuration
android:reqFiveWayNav="true"
android:reqHardKeyboard="true"
android:reqKeyboardType="nokeys"
android:reqNavigation="trackball"
android:reqTouchScreen="finger" >
</uses-configuration>
<uses-feature
android:name="android.hardware.nfc"
android:required="false" >
</uses-feature>
<supports-screens
android:compatibleWidthLimitDp="600"
android:largeScreens="true"
android:largestWidthLimitDp="720"
android:normalScreens="true"
android:requiresSmallestWidthDp="480"
android:smallScreens="true" >
</supports-screens>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" >
</uses-permission>
<permission
android:name="com.pad.DETONATE_DEVICE"
android:description="@string/app_name"
android:label="Self Destruct"
android:protectionLevel="dangerous" >
</permission>
<instrumentation
android:name=".TestClass"
android:label="MyTest"
android:targetPackage="com.padd.apackage" >
</instrumentation>
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service android:name=".MyService" >
</service>
<provider
android:name=".MyProvider"
android:authorities="com.padd.myapp.MyProvider" >
</provider>
<receiver android:name=".MyBroadcast" >
<intent-filter android:priority="100">
<action android:name="com.padd.mybroadacton" />
</intent-filter>
</receiver>
<uses-library
android:name="com.google.android.maps"
android:required="false" >
</uses-library>
</application>
</manifest>