Android基础——项目的文件结构(二)

AndroidManifest.xml文件分析

【注】此项目文件结构仅限于Android Studio下的Android项目!!!

  在一个Android项目中,AndroidManifest.xml文件(安卓清单文件)是整个APP的配置文件,它位于文件结构中app文件夹中,相当于根目录。四大组件都需要在AndroidManifest.xml文件中声明才可以使用,APP用到的相关权限都需要在AndroidManifest.xml文件中配置才不会影响使用,可以说AndroidManifest.xml是整个APP的领导者。所谓擒贼先擒王,那我们就最先分析一下AndroidManifest.xml文件的结构。

  一、大致结构

<?xml version="1.0" encoding="utf-8"?>
<manifest>

  <uses-configuration/> 
  <uses-feature/>  
  <uses-permission/>
  <permission/>
  <supports-screens/>

  <application> 

    <activity> 
      <intent-filter>
        <action/>
        <category/>
      </intent-filter> 
    </activity>

    <activity-alias> 
      <intent-filter></intent-filter> 
      <meta-data/> 
    </activity-alias> 

    <service> 
      <intent-filter></intent-filter> 
      <meta-data/> 
    </service>

    <receiver>
      <intent-filter></intent-filter> 
      <meta-data/> 
    </receiver> 

    <provider> 
      <grant-uri-permission/>
      <meta-data/> 
    </provider> 
    <uses-library/> 

  </application>  

</manifest>

  二、详细分析

  首句<?xml version="1.0" encoding="utf-8"?>,用于定义xml文件版本及编码格式。

  1、<manifest></manifest>

<manifest
    xmlns:android="http://schemas.android.com/apk/res/android"
    package="string"
    android:sharedUserId="string"
    android:sharedUserLabel="string"
    android:versionCode="int"
    android:versionName="string"
    android:installLocation=["auto" | "internalOnly" | "preferExternal"] >
</manifest>

  (1)xmlns:android

Android命名空间,一般为http://schemas.android.com/apk/res/android,这样使得Android中各种标准属性能在文件中使用,提供了大部分元素中的数据。

  (2)package

指定项目中java主程序包的包名,在项目建立时定义的一个路径,位于app/src/main/java/,是该APP安装运行后进程及数据包的默认名称,一般为公司域名.项目名。

  (3)sharedUserId

表明数据权限,默认情况下,Android给每个APP分配一个唯一的UserID,默认禁止不同APK访问共享数据的。若要共享数据,第一可以采用Share Preference方法,第二可以采用sharedUserId,将不同APP的sharedUserId都设为一样,这些APP之间就可以互相共享数据,为String类型数据。

  (4)sharedUserLabel

共享数据的用户名,只有在设置了sharedUserId属性的前提下才会有意义,为String类型数据。

  (5)versionCode

版本号,是APP升级更新的依据,必须是一个int值代表APP是第几个版本,比如APP刚上线时为1,之后若要更新版本就改为上个版本号+1。

  (6)versionName

版本名称是给用户看的,一般将APP版本名称设置为x.x.x的格式,第一位是重大更新修改功能时+1,第二位是修复bug时+1,第三位是数据更新或者样式小改动时+1。

  (7)installLocation

安装位置,Android2.2之后启用,有三个值可以选择:internalOnly(只能安装至内部存储)、preferExternal(优先安装至扩展存储即SD卡)、auto(系统自动选择)。

  2、<application></application>

  在这个标签中可以配置整个应用程序的相关属性。

<application
    android:allowClearUserData=["true" | "false"]
    android:allowTaskReparenting=["true" | "false"]
    android:backupAgent="string"
    android:debuggable=["true" | "false"]
    android:description="string"
    android:enabled=["true" | "false"]
    android:hasCode=["true" | "false"]
    android:icon="string"
    android:killAfterRestore=["true" | "false"]
    android:label="string"
    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="string" >
</application>

  (1)android:allowClearUserData(‘true’ or ‘false’)

用户是否能选择清除数据,默认为true,系统的应用管理器中包含一个清除数据的按钮,当android:allowClearUserData的值为true时,用户可以清除数据。

  (2)android:allowTaskReparenting(‘true’ or ‘false’)

配置是否允许activity更换从属task,当android:allowTaskReparenting的值为true时,启动新task的activity会成为该task的一部分。

  (3)android:backupAgent

自Android2.2启用,设置APP的备份,属性值是包名.类名,可以将数据备份到云端,并且还需实现BackupAgent或者BackupAgentHelper的子类才可进行备份。

  (4)android:debuggable

配置是否允许在手机上调试,当设置为true时,表明该APP在手机上可以被调试,默认为false,一般都在计算机上远程调试而不是在手机上调试。

  (5)android:description/android:label

此两个属性都是为许可提供的,均为字符串资源,当用户去看许可列表(android:label)或者某个许可的详细信息(android:description)时,这些字符串资源就可以显示给用户。label应当尽量简短,之需要告知用户该许可是在保护什么功能就行。而description可以用于具体描述获取该许可的程序可以做哪些事情,实际上让用户可以知道如果他们同意程序获取该权限的话,该程序可以做什么。我们通常用两句话来描述许可,第一句描述该许可,第二句警告用户如果批准该权限会可能有什么不好的事情发生。

  (6)android:enabled

Android系统是否能够实例化该应用程序的组件。如果为true,每个组件的enabled属性决定那个组件是否可以被实例化。如果为false,所有组件都不可以被实例化。

  (7)android:hasCode(‘true’ or ‘false’)

表示此APP中的组件是否包含代码,默认为true,若为false,则系统在运行APP中的组件时,不会加载代码(一般四大组件都含有代码)。

  (8)android:icon

声明整个APP的图标,属性值一般是drawable或者mipmap文件夹下的资源文件路径。

  (9)android:killAfterRestore

应用在系统重置之后是否终止运行。某个APP的重置操作不会导致应用被关闭,系统的重置操作完成后会使该属性值为true的应用终止运行,默认值为true。第三方应用一般不需要修改这个属性。

  (10)android:manageSpaceActivity

设置实例化activity子类的限定名称,系统可以启动这个子类让用户管理APP在设备上的内存占用。

  (11)android:name

为应用程序所实现的Application子类的全名,即包名.项目名。当应用程序进程开始时,该类在所有应用程序组件之前被实例化。

  (12)android:permission

设置许可名,给应用程序的所有组件设置许可的便捷方式,也可以被各组件设置的许可名所覆盖。

  (13)android:presistent

该应用程序是否应该在任何时候都保持运行状态,默认为false。应用程序通常不应该设置本标识,持续模式仅仅应该设置给某些系统应用程序才有意义。

  (14)android:process

应用程序运行的进程名,默认值为包名,每个组件都可以通过设置该属性来覆盖默认值。如果你想两个应用程序共用一个进程的话,你可以设置他们的android:process相同,但前提条件是它们共享一个用户ID及被赋予了相同证书。

  (15)android:restoreAnyVersion

自android2.2启用,表明应用是否准备尝试恢复所有的备份,即使是版本不匹配而可能导致数据不兼容,默认是false。

  (16)android:taskAffinity

拥有相同的affinity的Activity理论上属于相同的Task,应用程序默认的affinity值是包名。

  (17)android:theme

APP主题配置,它定义了一个默认的主题风格给所有的activity,系统中内置很多的主题可以进行选择,也可以自定义一个theme。

  3、<activity></activity>

  activity是Android应用程序四大组件之一,此标签声明了一个activity,并对该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: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"] > 

    <intent-filter>
        <action/>
        <category/>
        <data/>
    </intent-filter>
  
</activity>

  (1)android:alwaysRetainTaskState

是否保留状态不变,比如切换回home, 再重新打开,activity处于最后的状态。比如一个浏览器打开很多页面,用户并不希望丢失这些页面时,可将此属性设置为true。

  (2)android:clearTaskOnLaunch

启动时是否清除task中非MAIN activity,默认值为false,只可以配置在MAIN activity中,当该属性值为true时,程序运行中按下home键回到桌面后,再进入应用程序时显示MAIN activity。

  (3)android:configChanges

指定的属性发生时,activity不销毁重建,并执行onConfigurationChanged()方法。未配置该属性的情况下,发生屏幕旋转等影响activity显示的变化时,activity将被销毁重建。

  (4)android:excludeFromRecents

是否显示在最近打开的activity列表里,默认是false。

  (5)android:finishOnTaskLaunch

启动时是否关闭已打开的activity,默认是false,当该属性值为true时,程序运行中按下home键回到桌面后,再进入应用程序时将销毁所有activity,重新打开MAIN activity。

  (6)android:launchMode

Activity有四种加载模式:

standard、singleTop、singleTask、singleInstance,默认为standard。

standard:每次跳转到一个activity时都会构造新的activity实例。

singleTop:每次跳转到一个activity时,先判断目标activity是否位于栈顶,若位于栈顶则不会构造新的activity实例,否则构造新的activity实例。

singleTask:每个activity只创建一个实例,跳转activity时先检查栈内是否有目标activity,若有则显示该activity并将该activity置于栈顶,否则构造新的activity实例。

singleInstance:配置该模式的activity只创建一个实例,在启动时将会进入一个新的栈,一般常被其他应用程序调用的activity会配置该模式,如支付宝付款时显示的活动。

  (7)android:multiprocess

设置activity能否被实例化到启动它的进程栈中,默认为false。通常,一个activity实例会被加载到定义它的应用程序的进程中。

  (8)android:noHistory

当用户从activity上离开并且它在屏幕上不再可见时,activity是否从栈中清除并销毁,默认值为false。

  (9)android:screenOrientation

activity显示的模式,默认为unspecified:由系统自动判断显示方向。

landscape:横屏模式,宽度比高度大。

portrait:竖屏模式, 高度比宽度大。

user:用户当前首选的方向。

behind:和栈中位于该activity下面的那个Activity方向一致。

sensor:由重力感应器来决定,用户旋转设备时屏幕会在横竖屏中切换。

nosensor:忽略重力感应器,屏幕方向不会随着用户旋转设备而更改。

  (10)android:stateNotNeeded

activity被意外销毁或者重启时是否不再保持状态,默认情况为false,若设为true,则当activity在后台被系统意外销毁或重新启动时不会调用onSaveInstanceState()方法。

  (11)android:windowSoftInputMode

activity主窗口与软键盘的交互模式,可以用来避免输入法面板遮挡问题。这个属性能影响两件事情:当有焦点产生时,软键盘是隐藏还是显示;是否减少活动主窗口大小以便腾出空间放软键盘。各值的含义:

stateUnspecified:软键盘的状态并没有指定,系统将选择一个合适的状态或依赖于主题的设置。

stateUnchanged:当这个activity出现时,软键盘将保持在上一个activity里的状态。

stateHidden:用户选择activity时,软键盘总是被隐藏。

stateAlwaysHidden:当该activity主窗口获取焦点时,软键盘总是被隐藏。

stateVisible:软键盘总是可见的。

stateAlwaysVisible:用户选择activity时,软键盘总是显示。

adjustUnspecified:默认设置,由系统自行决定是隐藏还是显示。

adjustResize:该activity总是调整屏幕的大小以便留出软键盘的空间。

adjustPan:当前窗口的内容将自动移动以便当前焦点从不被键盘覆盖和用户能总是看到输入内容的部分。

  (12)<intent-filter></intent-filter>

<intent-filter
    android:icon="drawable resource"
    android:label="string resource"
    android:priority="integer" >

    <action />
    <category />
    <data />

</intent-filter>

  android:priority:有序广播主要是按照声明的优先级别,如A的级别高于B,那么,广播先传给A,再传给B。优先级别就是用设置priority属性来确定,范围是从-1000~1000,数越大优先级别越高。

  action:只有android:name这个属性。常见的android:name值为android.intent.action.MAIN,表明此activity是作为应用程序的入口。

Action常量

对应字符串

简单说明

ACTION_MAIN

android.intent.action.MAIN

应用程序入口

ACTION_VIEW

android.intent.action.VIEW

显示指定数据

ACTION_ATTACH_DATA

android.intent.action.ATTACH_DATA

指定某块数据将被附加到其他地方

ACTION_EDIT

android.intent.action.EDIT

编辑指定数据

ACTION_PICK

android.intent.action.PICK

从列表中选择某项并返回所选的数据

ACTION_CHOOSER

android.intent.action.CHOOSER

显示一个Activity选择器

ACTION_GET_CONTENT

android.intent.action.GET_CONTENT

让用户选择数据,并返回所选数据

ACTION_DIAL

android.intent.action.DIAL

显示拨号面板

ACTION_CALL

android.intent.action.CALL

直接向指定用户打电话

ACTION_SEND

android.intent.action.SEND

向其他人发送数据

ACTION_SENDTO

android.intent.action.SENDTO

向其他人发送消息

ACTION_ANSWER

android.intent.action.ANSWER

应答电话

ACTION_INSERT

android.intent.action.INSERT

插入数据

ACTION_DELETE

android.intent.action.DELETE

删除数据

ACTION_RUN

android.intent.action.RUN

运行数据

ACTION_SYNC

android.intent.action.SYNC

执行数据同步

ACTION_PICK_ACTIVITY

android.intent.action.PICK_ACTIVITY

用于选择Activity

ACTION_SEARCH

android.intent.action.SEARCH

执行搜索

ACTION_WEB_SEARCH

android.intent.action.WEB_SEARCH

执行Web搜索

ACTION_BATTERY_LOW

android.intent.action.ACTION_BATTERY_LOW

电量低

ACTION_MEDIA_BUTTON

android.intent.action.ACTION_MEDIA_BUTTON

按下媒体按钮

ACTION_PACKAGE_ADDED

android.intent.action.ACTION_PACKAGE_ADDED

添加包

ACTION_PACKAGE_REMOVED

android.intent.action.ACTION_PACKAGE_REMOVED

删除包

ACTION_FACTORY_TEST

android.intent.action.FACTORY_TEST

工厂测试的入口点

ACTION_BOOT_COMPLETED

android.intent.action.BOOT_COMPLETED

系统启动完成

ACTION_TIME_CHANGED

android.intent.action.ACTION_TIME_CHANGED

时间改变

ACITON_DATE_CHANGED

android.intent.action.ACTION_DATE_CHANGED

日期改变

ACTION_TIMEZONE_CHANGED

android.intent.action.ACTION_TIMEZONE_CHANGED

时区改变

ACTION_MEDIA_EJECT

android.intent.action.MEDIA_EJECT

插入或拔出外部媒体

category:只有android:name属性。常见的android:name值为android.intent.category.LAUNCHER,决定应用程序是否显示在程序列表里。

Category常量

对应字符串

简单说明

CATEGORY_DEFAULT

android.intent.category.DEFAULT

默认的Category

CATEGORY_BROWSABLE

android.intent.category.BROWSABLE

指定该Activity能被浏览器安全调用

CATEGORY_TAB

android.intent.category.TAB

指定该Activity作为TabActivity的Tab页

CATEGORY_LAUNCHER

android.intent.category.LAUNCHER

Activity显示顶级程序列表中

CATEGORY_INFO

android.intent.category.INFO

用于提供包信息

CATEGORY_HOME

android.intent.category.HOME

设置该Activity随系统启动而运行

CATEGORY_PREFERENCE

android.intent.category.PREFERENCE

该Activity是参数面板

CATEGORY_TEST

android.intent.category.TEST

该Activity是一个测试

CATEGORY_CAR_DOCK

android.intent.category.CAR_DOCK

指定手机被插入汽车底座(硬件)时运行该Activity

CATEGORY_DESK_DOCK

android.intent.category.DESK_DOCK

指定手机被插入桌面底座(硬件)时运行该Activity

CATEGORY_CAR_MODE             

android.intent.category.CAR_MODE

设置该Activity可在车载环境下使用

  (13)<meta-data/>

<meta-data
    android:name="string"
    android:resource="resource specification"
    android:value="string"/>

  用于标识供父组件使用的键值对,一般情况下使用时只需要在对应的组件下声明name和value,若要提供比较复杂的数据,可以使用android:resource提供该资源的ID。

android:name      元数据项的名字,即键,为了保证键是唯一的,采用java风格的命名规范,如com.project.module.data。

android:value     元数据项的值,可使用string、int、float、boolean类型的数据。

android:resource  元数据项的资源ID值,可使用res文件夹下的图片、xml、文件等。

  4、<activity-alias></activity-alias>

  activity-alias作为一个已存在activity的别名,则应该可以通过该别名标签声明快速打开目标activity。因此activity-alias可用来设置某个activity的快捷入口,可以放在桌面上或者通过该别名被其他组件快速调起。该标签元素支持一些属性及intent-filter、meta-data等配置,因此可以触发一些跟目标activity不同的功能逻辑,虽然打开的是同一个activity。

<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" >

    <intent-filter></intent-filter>
    <meta-data/>

</activity-alias>

  (1)android:enable

该属性用来决定目标Activity可否通过别名被系统实例化,默认为true。需要注意的是application也有enable属性,只用当它们同时为true时,activity-alias的enable才生效。

  (2)android:exported

该属性为true的话,则目标Activity可被其他应用调起,如为false则只能被应用自身调起。其默认值根据activity-alias是否包含intent-filter元素决定,如果有的话,则默认为true;没有的话则为false。如果有intent-filter,则目标Activity可以匹配隐式Intent,因此可被外部应用唤起;如果没有intent-filter,则目标Activity要被调起的话必须知道其精确类名,因为只有应用本身才知道精确类名,所以此时默认为false。

  (3)android:icon

允许自定义icon,可以不同于应用本身在桌面的icon。如果需要在桌面上创建快捷入口,也许产品会要求换个不同的icon。

  (4)android:label

该属性类似于android:icon,图标都换了,换个名称也合情合理吧,此属性就是为此而生的。

  (5)android:name

该属性可以为任意字符串,但最好符合类名命名规范。activity元素的name属性实质上都会指向一个具体的Activity类,而activity-alias的name属性仅作为一个唯一标识而已。

  (6)android:permission

该属性指明了通过别名声明调起目标Activity所必需的权限。

  (7)android:targetActivity

该属性指定了目标activity,即通过activity-alias调起的activity是哪个,此属性其实类似于activity标签中的name属性,需要规范的包名.类名。

  5、<service></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">

    <intent-filter></intent-filter>
    <meta-data/>

</service>

  各属性与activity-alias含义相同,参考其解释即可

  6、<receiver></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">

    <intent-filter></intent-filter>
    <meta-data>

</receiver>

  各属性与activity-alias含义相同,参考其解释即可

  7、<provider></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">

    <grant-uri-permission/>
    <meta-data/>

</provider>

  (1)android:authorities

标识内容提供器范围内的数据URI的授权列表,有多个授权时,要用分号来分离每个授权。为了避免冲突,授权名应该使用包名.类名。

  (2)android:grantUriPermissions

是否能临时超越readPermission、writePermission和permission属性的限制,给平常无权对Content Provider数据的访问进行授权,true可以授权,false不可以。如果设为true,则可对Content Provider的所有数据进行授权访问。如果设为false,那就只能对<grant-uri-permission>子元素中列出的数据子集(假如存在的话)进行授权。默认值是false。

  (3)android:initOrder

对于处在同一进程中的不同content provider来说,该属性值代表了不同content provider之间的初始化顺序。当不同的content provider之间有相互依赖时,设置该属性之后,可以确保相互依赖的content provider被按照一定的顺序创建。该属性的值为整数,并且数值越大优先级越高。

  (4)<grant-uri-permission/>

<grant-uri-permission
    android:path="string"
    android:pathPattern="string"
    android:pathPrefix="string" />

  这个元素用于给内容提供器的数据子集授权。数据子集是由content:URI的路径部分来标识的。授权是提供器给客户端提供的一种能力,这样客户就可以访问通常没有权限访问的数据,从而克服基于单次访问的限制。如果内容提供器的grantUriPermissions属性被设置为true,那么权限能够被授予内容提供器范围内的任何数据。但是,如果grantUriPermission属性被设置为false,那么权限就只能授予这个元素所指定的数据子集。一个内容提供器能够包含任意多个个<grant-uri-permission>元素。每个都只能指定一个路径(三个可能属性中的一个)。

  path属性指定了一个完整的路径,权限只能被授予这个路径所标识的具体的数据子集。pathPrefix属性指定了路径的初始部分,权限能够被授予共享这个初始路径的所有数据子集。pathPattern属性指定了一个完整的路径,但是这个路径中包含了通配符。

  8、<uses-library/>

<uses-library
    android:name="string"
    android:required=["true" | "false"] />

  这个元素用于指定该应用程序必须链接的共享类库。这个元素告诉系统该应用程序包的类装载器中所包含的类库代码。Android的所有包(如andorid.app,android.content,android.view和android.widget等)都在应用程序自动链接的默认类库中。但是,有些包是在于独立的类库中,它们不能被自动的链接到应用程序包中,要查看这些包的文档,以确定要把哪些类库包含到包的代码中。如果在该应用的清单中出现这个元素,并且它的android:required属性被设置为true,那么除非该类库在用户的设备上存在,否则PackageManager框架不会让用户安装这个应用程序。

  (1)android:name

这个属性用于指定类库的名称。这个名称是在对应的类库文档中提供的。例如:android.test.runner库就是包含Android测试类的一个程序包。

  (2)android:required

这个属性用于指定应用程序是否需要有android:name属性所指定的类库,默认值是true。

true:没有这个库应用程序无法工作。如果用户设备设备上没有这个类库,系统不允许该应用程序安装在这个设备上。

false:如果该类库存在,则应用程序能够使用这个类库,但是如果有必要,也可以设计成没有该类库,应用程序也能够工作。系统会允许应用程序安装,即使该类库不存在。如果使用false,就要在运行时对类库的有效性进行必要的检查。对于类库的检查,可以使用反射机制来判断一个具体的类是否有效。默认值是true。

  9、<uses-configuration/>和<uses-feature/>

<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:glEsVersion="integer"
    android:name="string"
    android:required=["true" | "false"] />

  两个标签都指明应用程序的软硬件需求。

  【<uses-configuration/>标签的声明会给Android系统提供依据,判断本设备是否可以运行该应用程序并决定是否安装该应用程序。】

  (1)android:reqFiveWayNav

应用程序是否需要五维导航键:“true”使用,“false”不使用。五维控制键可以实现上下左右移动及提交当前选中项,可以是 D-pad(方向键)、轨迹球或其他设备。如果应用程序需要用到方向键,但不指定是哪种设备,则可以将本属性设为“true”并忽略 reqNavigation 属性。但如果需要某个指定类型的方向键,那么可以忽略本属性并换用 reqNavigation 。

  (2)android:reqHardKeyboard

应用程序是否需要用到硬件键盘:“true”使用,“false”不使用。android:reqKeyboardType当存在键盘时,应用程序需要用到的键盘类型。本属性不区分硬键盘和软键盘。如果需要指定某种类型的硬件键盘,请设置本属性并同时将 reqHardKeyboard 属性设为“true”。本属性值必须是以下字符串之一:


说明

"undefined"

应用程序不需要使用键盘(未声明键盘需求。)这是默认值。

"nokeys"

应用程序不需要使用键盘。

"qwerty"

应用程序需要用到标准的 QWERTY 键盘。

"twelvekey"

应用程序需要用到大多数电话附带的 12 键数字键盘 — 包括数字键 0-9、星号(*)、井号(#)键。

  (3)android:reqNavigation

当设备存在时,应用程序需要用到的导航设备。如果应用程序需要用到导航键,但无所谓是哪种确切的类型,那就可以将 reqFiveWayNav 属性设为“true”,以取代本属性。本属性值必须是以下字符串之一:


说明

"undefined"

应用程序不需要使用导航键。(未声明导航键需求。)这是默认值。

"nonav"

应用程序不需要使用导航键。

"dpad"

应用程序需要使用 D-pad (方向键)进行导航。

"trackball"

应用程序需要使用轨迹球进行导航。

"wheel"

应用程序需要用到导航拨轮。

  (4)android:reqTouchScreen

当设备存在时,应用程序需要用到的触摸屏类型。本属性值必须是以下字符串之一:


说明

"undefined"

应用程序不需要使用触摸屏。(未声明触摸屏需求。)这是默认值。

"notouch"

应用程序不需要使用触摸屏。

"stylus"

应用程序需要用到触笔操作的触摸屏。

"finger"

应用程序需要用到手指操作的触摸屏。

注意: 如果应用程序需要用到某种类型的触摸屏输入手段,请换用 < uses-feature > 声明触摸屏的类型需求,以"android.hardware.faketouch" 开头的为基本型触摸事件。

  【<uses-feature/> 标签的声明仅仅是告知性质的,这意味着 Android 系统本身不会在安装程序前检查设备是否支持这些特性。】

  不过,其他服务(如Google Play)或者其他应用程序可以检查<uses-feature>声明来进行相应处理或与本应用程序进行交互。

  (1)android:name

定义一项应用程序需要用到的软、硬件特性,用字符串格式的描述符表示。合法的描述符值在下文的硬件特性和软件特性表中列出。这些描述符是大小写敏感的。android:required布尔值,指明应用程序是否需要用到 android:name 属性给出的特性。如果对某项特性声明了“android:required="true"”,则表示当设备不提供指定特性时,应用程序就不能正常运行或未设计为能够正常运行。如果对某项特性声明了“android:required="false"”,则意味着如果设备支持则应用程序将优先使用此特性,但设计程序时是考虑没有该项特性也能正常工作的。如未明确给出声明,则android:required 的默认值是“true”。

  (2)android:glEsVersion

应用程序需要的OpenGL ES版本。高16位代表大版本号,低16位代表小版本号。例如:要指定为OpenGL ES 2.0,应该设为“0x00020000”;要指定为OpenGL ES 2.1,应该设为“0x00020001”;要指定为OpenGL ES 3.0,则应该设为“0x00030000”。应用程序应该在androidManifest.xml中至少定义一项android:glEsVersion属性。如果定义了两项以上的android:glEsVersion,将会采用数字最大的那个值,其他值将被忽略。

  10、<uses-permission/>和<permission/>

<uses-permission android:name="string" />

<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"] />

  在android系统的安全模型中,应用程序在默认的情况下不可以执行任何对其他应用程序、系统或者用户带来负面影响的操作。如果应用需要执行某些操作,就需要声明使用这个操作对应的权限。上述两个标签都用来声明应用程序需要的权限。

  【<uses-permission/>标签所声明的权限是系统已经定义好的权限,只需要提供一个权限名即可】

  android系统提供了一系列这样的权限,具体可以查看android 权限,另外,android系统在新的版本中会增加一些permission,可以查看android 版本信息。链接请FQ

  【<permission/>标签是自定义一个权限】

  (1)android:description

对权限的描述,一般是两句话,第一句话描述这个权限所针对的操作,第二句话告诉用户授予app这个权限会带来的后果 android:label: 对权限的一个简短描述 

  (2)android:name

权限的唯一标识,一般都是使用 报名加权限名 

  (3)android:permissionGroup

权限所属权限组的名称 

  (4)android:protectionLevel

权限的等级。normal 是最低的等级,声明次权限的app,系统会默认授予次权限,不会提示用户 。dangerous  权限对应的操作有安全风险,系统在安装声明此类权限的app时会提示用户。signature  权限表明的操作只针对使用同一个证书签名的app开放。signatureOrSystem  与signature类似,只是增加了rom中自带的app的声明。

  11、<supports-screens/>

<supports-screens
    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"/ >

  定义应用程序支持的屏幕尺寸,并针对更大的屏幕启用 屏幕兼容模式。 请确保用本元素来指定应用程序支持的屏幕尺寸,这是非常重要的。所谓应用程序“支持”的屏幕尺寸,是指程序能够自动改变尺寸来填充整个屏幕。 通常系统提供的自动调整功能可以适用于大多数应用程序,不必做什么额外的工作就能让程序在更大屏幕的手持设备上正常运行。

  (1)android:smallScreens

指明应用程序是否支持 small 尺寸的屏幕。 small 尺寸的屏幕定义为小于“normal”(传统的HVGA)尺寸的屏幕。 不支持 small 屏幕的应用程序将在外部服务(比如 Google Play )中禁止用于小屏幕设备,因为只有很少一部分平台能让程序运行在小屏幕上。 默认值是“true”。

  (2)android:normalScreens

指明应用程序是否支持“normal”尺寸的屏幕。 传统意义上这指的是中等密度的 HVGA 屏幕,但低密度的 WQVGA 和高密度的 WVGA 一般也被视为是 normal 尺寸。 默认属性是“true”。

  (3)android:largeScreens

指明应用程序是否支持 larger 尺寸的屏幕。 large 屏幕是指明显比“normal”手持设备更大的屏幕。 虽然依靠系统的改变尺寸功能也能实现全屏显示,但为了充分利用屏幕的空间,可能还是需要对应用程序进行特殊的设计。本属性的默认值依版本而各不相同,因此最好是确保明确声明这个属性。 注意,将本属性设为“false”将总是启用屏幕兼容模式。

  (4)android:xlargeScreens

指明应用程序是否支持 xlarge 尺寸的屏幕。 xlarge 屏幕定义为明显比“large”尺寸更大的屏幕,比如平板电脑(或更大的设备)。 虽然依靠系统的改变尺寸功能也能实现全屏显示,但为了充分利用屏幕的空间,可能还是需要对应用程序进行特殊的设计。本属性的默认值依版本而各不相同,因此最好是确保明确声明这个属性。 注意,将本属性设为“false”将总是启用屏幕兼容模式。

  (5)android:anyDensity

指明应用程序是否包含适应所有屏幕密度的资源。对于支持 Android 1.6 (API 级别 4)以上版本的应用程序而言,本属性的默认值是“true”。 除非确实确认程序必须要能运行,否则请勿设为“false”。 只有当应用程序要直接操作位图时(详情参阅文档 支持多种屏幕),才可能需要禁用此属性。

  (6)android:requiresSmallestWidthDp

指定应用程序所需的 smallestWidth 最小值。 smallestWidth 是指用户界面可以使用的最小屏幕空间(单位为 dp)— 也即屏幕两个方向边长中最短的那条。  因此,为了保证与应用程序兼容,设备的 smallestWidth 必须大于等于本属性值。 (通常这里给出的值是程序屏幕布局支持的“最小宽度”,而与屏幕当前的方向无关。)例如,典型的手持设备的最小宽度是 320dp,7 英寸平板电脑的最小宽度是 600dp,10英寸平板电脑的最小宽度是720dp。 因为这些值是屏幕可用空间的最小值,所以一般也即是 smallestWidth 的值。

  (7)android:compatibleWidthLimitDp通过指定程序支持的“最小屏幕宽度”的最大值,本属性可启用 屏幕兼容模式 为用户提供可选项。 如果设备可用屏幕的最短边长大于在此设置的值,用户仍然可以安装程序,但会运行于屏幕兼容模式。 默认情况下,屏幕兼容模式将被关闭,Layout 通常将缩放至全屏显示,只是在系统状态栏中会出现一个按钮,用户可以用此按钮来开关屏幕兼容模式。如果应用程序能够兼容所有尺寸的屏幕, Layout 也能正常缩放,那就不需要用到本属性。

  (8)android:largestWidthLimitDp通过指定程序支持的“最小屏幕宽度”的最大值,本属性可强制开启 屏幕兼容模式。 如果设备屏幕的最小边长大于本属性值,应用程序将运行在屏幕兼容模式,且用户无法禁用此模式。如果应用程序能兼容所有尺寸的屏幕, Layout 也能够正常缩放,那就不需要用到本属性。 即使不行,也应优先考虑使用 android:compatibleWidthLimitDp 属性。 仅当缩放到大屏幕时应用程序会崩溃,且屏幕兼容模式是用户唯一可用的方式时,才会用到 android:largestWidthLimitDp 属性。