Android中项目的AndroidManifest.xml文件的作用及改文件中相关属性的具体介绍

每创建一个Android项目,都会生成相应的AndroidManifest.xml文件,但该文件中有些节点的具体含义还不是很清楚,今天就系统的学习下。

AndroidManifest.xml 是每个android程序中必须的文件。它位于整个项目的根目录,描述了package中暴露的组件(activities, services等等),他们各自的实现类,各种能被处理的数据和启动位置。 除了能声明程序中的Activities, ContentProviders, Services, 和Intent Receivers,还能指定permissions和instrumentation(安全控制和测试)。

先给出一个标准的AndroidManifest.xml文件的格式(当然世纪项目中可能不是所有的节点都包含在内的,这里只是为了便于详细分析):

  
  
  
  
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
          
          
          
              
                  
                  
                  
              
              
          
          
          
             . . .   
              
          
          
          
          
             . . .   
              
          
          
          
          
             . . .   
              
          
          
          
          
              
              
          
          
          
          
  
      
  
  
从以上实例代码中可以看出,Android配置文件采用xml作为描述语言,每个XML标签都有着特殊的含义,相关的配置参数一般都是通过节点的属性来进行配置的,下面就依据上面实例代码中给出的节点顺序来进行具体分析。

AndroidManifest.xml文件的根元素,必须包含一个子节点,同时必须设置xmlns:android和package属性。xmlns:android属性指定了Android的命名空间,默认情况下一般对应的值时"http://schemas.android.com/apk/res/android";package是标准的应用包名,同时也是一个应用进程的默认名称。还有一些其它常用属性如android:versionCode和android:versionName,字面上理解就是版本号和版本名称,设置这两个属性一般是为了实现应用的版本升级,android:revisoncode表示修改版本号,该属性是API在22以上才有的,android:installLocation表示应用安装位置,有自动、内存和外部存储三个值可供选择;android:sharedUserId属性用于不同apk通过某个约定的名称(即相同UserID来进行相互之间的数据访问),也就是说该属性是用来进行不同应用见数据共享而设置的,android:sharedUserLabel属性只有在设置了android:sharedUserId属性后才有效,其值必须是定义的字符串资源,不能时原生字符串。使用范例如下:


... ...

关于android:sharedUserId属性的更详细讲解,请参考这里

为了保证应用程序的安全性,应用框架指定了比较严格的权限系统,一个应用程序必须声明了正确的权限才能使用相应的功能,例如我们要想应用程序能访问网络就要配置“android.permission.INTERNET”,要使用相机功能就要配置"android.permission.CAMERA"等。是我们最常使用的权限设定标签,我们通过设定android:name属性来声明相应的权限名,看看如下范例:


... ...
    
    
    
    
    
    
    
    
    
... ...


权限声明标签,定义了供给使用的具体权限,通常情况下我们不需要为自己的应用程序声明某个权限,除非要给其它应用程序提供可调用的代码或数据,这个时候你才需要使用标签,该标签提供了权限名标签android:name、权限图标android:icon、权限描述android:description等属性,另外还可以配合来构造更有层次、更有针对性的权限系统。permission标签范例如下:


用于声明Instrumentation测试类来监控Android应用的行为并应用到相关的功能测试中,其中比较重要的属性有:测试功能开关android:functionalTest,profiling调试功能开关android:handleProfiling,测试用例目标对象android:targetPackage等。另外,我们需要注意的是Instrumentation对象是在应用程序的组件之前被实例化的,这点在组织测试逻辑的时候需要被考虑到标签语法范例如下:


用于指定Android应用中所需要使用的SDK的版本,比如我们的应用必须运行于Android 2.0以上版本的系统SDK之上,那么就需要指定应用支持最小的SDK版本数为5;当然,每个SDK版本都会有指定的整数值与之对应,比如我们最常用的Android 2.2.x的版本数是8。当然,除了可以指定最低版本之外,标签还可以指定最高版本和目标版本,语法范例如下:


那么问题来了,当我们手机的SDK版本低于指定的最小版本时,该应用能否安装到手机上?

首先,我指定minSdkVersion为15,然后创建一个API版本为14的模拟器和一个API版本为17的模拟器,当运行程序弹出Device Chooser窗口时,API版本为14的模拟器的Compatible项提示为红色的No,窗口OK项不可点,也就是当模拟器的Api版本低于Apk指定的最小版本时,Apk时不能安装在模拟器上的,会提示“The selected device is incaopatible“

另外一个值得注意的问题就是现在才用gradle构建android项目,当项目的build.gradle中指定了minSdkVersion和targetSdkVersion时,AndroidManifest.xml文件中定义的就无效了,另外,编译是采用的sdkVersion也可以在build.gradle中指定,对应的是compileSdkVersion属性,即通过该属性来指定编译采用的Sdk版本




这两个标签都是用于描述应用所需要的硬件和软件特性,以便防止应用在没有这些特性的设备上安装。标签中,比如有些设备带有D-pad或者Trackball这些特殊硬件,那么android:reqFiveWayNav属性就需要设置为true;而如果有一些设备带有硬件键盘,android:reqHardKeyboard也需要被设置为true。另外,如果设备需要支持蓝牙,我们可以使用来支持这个功能。这两个标签主要用于支持一些特殊的设备中的应用,两个标签的语法范例分别如下:

范例:

范例:


对于一些应用或者游戏来说,只能支持某些屏幕大小的设备或者在某些设备中的效果比较好,我们就会使用标签来指定支持的屏幕特征。其中比较重要的属性包括:屏幕自适应属性android:resizeable,小屏(android:smallScreens)、中屏(android:normalScreens)、大屏(android:largeScreens)和特大屏(android:xlargeScreens)支持属性,按屏幕渲染图像属性android:anyDensity以及最小屏幕宽度属性android:requiresSmallestWidthDp等。标签的语法范例如下:


关于标签更详细的讲解,请参考 这里


应用配置的根元素,位于下层,包含所有与应用有关配置的元素,其属性可以作为子元素的默认属性,常用的属性包括:应用名android:label,应用图标android:icon,应用主题android:theme等。当然,标签还提供了其他丰富的配置属性,由于篇幅原因就不列举了,大家可以打开Android SDK文档来进一步学习,以下是语法范例:


... ...


Activity活动组件(即界面控制器组件)的声明标签,Android应用中的每一个Activity都必须在AndroidManifest.xml配置文件中声明,否则系统将不识别也不执行该Activity。标签中常用的属性有:Activity对应类名android:name,对应主题android:theme,加载模式android:launchMode,键盘交互模式android:windowSoftInputMode等,其他的属性用法大家可以参考Android SDK文档学习。另外,标签还可以包含用于消息过滤的元素,当然还有可用于存储预定义数据的元素,以下是标签的语法范例:

   
... ...




Activity组件别名的声明标签,简单来说就是Activity的快捷方式, 属性android:targetActivity表示的就是其相关的Activity名,当然必须是前面已经声明过的Activity。除此之外,其他比较常见的属性有:Activity别名名称android:name,别名开关android:enabled,权限控制android:permission等。另外,我们还需要注意的是, Activity别名也是一个独立的Activity,可以拥有自己的元素,其语法范例如下:


... ...




用于Intent消息过滤器的声明,Intent消息对于Android应用系统来说,是非常重要的“粘合剂”,元素可以放在元素标签中,来区分可用于处理消息的Activity控制器、Service服务和广播接收器Broadcast Receiver。另外,我们还知道Intent消息还包含有名称、动作、数据、类别等几个重要属性。这点与该标签的写法也有一定的关系,比如中必须包含有元素,即用于描述具体消息的名称;标签则用于表示能处理消息组件的类别,即该Action所符合的类别;而元素则用于描述消息需要处理的数据格式,我们甚至还可以使用正则表达式来限定数据来源。当然,这些元素和标签的具体用法我们还需要慢慢学习,下面是标准元素标签的语法范例:


    
    
    




用于存储预定义数据,和类似,也可以放在这四个元素标签中。Meta数据一般会以键值对的形式出现,个数没有限制,而这些数据都将被放到一个Bundle对象中,程序中我们则可以使用ActivityInfo、ServiceInfo甚至ApplicationInfo对象的metaData属性中读取。假设我们在一个Activity中定义了一个元素,相关示例用法如下:


    


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等,以下是标签的语法范例:


... ...




Boardcast Receiver广播接收器组件的声明标签,用于定义与描述一个具体的Android广播接收器,其主要属性和标签有些类似:Boardcast Receiver接收器类名android:name,接收器图标android:icon,接收器描述android:label以及接收器开关android:enabled等,以下是标签的使用范例:

... ...




除Activity、Service和Boardcast Receiver之外的另一个“四大组件”,也就是Content Provider内容提供者的声明标签。标签除了和其他组件相同的android:name、android:icon和android:label等基础属性之外,还提供了用于支持其功能的特殊属性,如:内容提供者标识名称android:authorities,对指定URI授予权限标识android:grantUriPermission以及具体的读、写权限,即android:readPermission和android:writePermission等。当然,这些属性的具体用法我们还需要慢慢学习,以下是标签的语法范例:


... ...


用于指定Android应用可使用的用户库,除了系统自带的android.app、android.content、android.view和android.widget这些默认类库之外,有些应用可能还需要一些其他的Java类库作为支持,这种情况下我们就可以使用标签让ClassLoader加载其类库供Android应用运行时用。标签的用法很简单,以下是语法范例:


小知识

当运行Java程序时,首先运行JVM(Java虚拟机),然后再把Java类加载到JVM里头运行,负责加载Java类的这部分就叫做ClassLoader。当然,ClassLoader是由多个部分构成的,每个部分都负责相应的加载工作。当运行一个程序的时候,JVM启动,运行BootstrapClassLoader,该ClassLoader加载java核心API(ExtClassLoader和AppClassLoader也在此时被加载),然后调用ExtClassLoader加载扩展API,最后AppClassLoader加载CLASSPATH目录下定义的Class,这就是一个Java程序最基本的加载流程。


以上就是AndroidManifest.xml文件的粗略讲解,接下来的事件可能针对上面提到的四大组件进行详细的说明。




你可能感兴趣的:(Android学习开发,android,android开发)