天天看点

Android Manifest文件详解

Android项目中的Manifest.xml文件是Android应用的入口文件,用来声明权限配置,四大组件,Intent等。

结构图

<?xmlversion="1.0"encoding="utf-8"?>
<manifest>
    <uses-sdk/> 
    <uses-configuration/> 
    <uses-feature/>  

    <uses-permission/>
    <permission/>
    <permission-tree/>
    <permission-group/>
    <instrumentation/> 

    <supports-screens/>

    <application> 

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

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

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

Manifest:属性

<manifest  xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.finddreams.csdn"
          android:sharedUserId="string"
          android:sharedUserLabel="string resource"
          android:versionCode="integer"
          android:versionName="string"
          android:installLocation=["auto" | "internalOnly" | "preferExternal"] >
</manifest>
           
  • xmlns:定义了android的命名空间,一般为http://schemas.andorid.com/apk/res/android,这样使Android中各种标准属性能在文件中使用,提供了大部分元素中的数据。
  • packge:指定本应用内Java主程序包的包名,他也是一个应用进程的默认名称。
  • sharedUserId:表明数据权限,因为默认情况下,Android给每个APK分配一个唯一的userID,所以是默认禁止不同的APK访问共享数据的,若要共享数据,可以采用sharedUserId,将不同的APKsharedUserId都设为一样的,则这些APK之间就可以共享数据了,参考见: http://blog.csdn.net/jiangwei0910410003/article/details/51316688
  • sharedUserLabel:一个共享的用户名,它只有在设置了sharedUserId属性的前提下才会有意义。
  • versionCode:是给设备程序识别版本(升级)用的。必须是一个Integer值。
  • versionName:这个名称是给用户看的。例如1.1.1,
  • installLocation:安装参数,是Android2.2中的一个新特性,installLocation有三个值可以选择:
    • preferExternal:,系统会优先考虑将APK安装到SD卡上(当然最终用户可以选择为内部ROM存储上,如果SD存储已满,也会安装到内部存储上)
    • auto:系统将会根据存储空间自己去适应
    • internalOnly:是指必须安装到内部才能运行

Application:属性

一个AndroidManifest.xml中必须含有一个Application标签,这个标签声明了每一个应用程序的组件及其属性(如icon,label,permission等)

<application  android:allowClearUserData=["true" | "false"]
             android:allowTaskReparenting=["true" | "false"]
             android:backupAgent="string"
             android:debuggable=["true" | "false"]
             android:description="string resource"
             android:enabled=["true" | "false"]
             android:hasCode=["true" | "false"]
             android:icon="drawable resource"
             android:killAfterRestore=["true" | "false"]
             android:label="string 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" >
</application>
           
  • android:name:应用程序中继承Application的子类的全名。当应用程序进程开始时,该类在所有应用程序组件之前被实例化。
  • android:label:APP名称
  • android:icon:APP图标
  • android:theme:APP的主题资源。@style/AppTheme
  • android:description:APP描述

    (下面是一些不常用属性)

  • android:enabled:Android系统是否能够实例化该应用程序的组件,如果为true,每个组件的enabled属性决定那个组件是否可以被 enabled。如果为false,它覆盖组件指定的值;所有组件都是disabled。
  • android:allowClearUserData:用户是否能选择自行清除数据,默认为true,程序管理器包含一个选择允许用户清除数据。当为true时,用户可自己清理用户数据,反之亦然
  • android:allowTaskReparenting:是否允许activity更换从属的任务,比如从短信息任务切换到浏览器任务
  • android:backupAgent:这也是Android2.2中的一个新特性,设置该APP的备份,属性值应该是一个完整的类名,如com.project.TestCase,此属性并没有默认值,并且类名必须得指定(就是个备份工具,将数据备份到云端的操作)
  • android:debuggable:这个从字面上就可以看出是什么作用的,当设置为true时,表明该APP在手机上可以被调试。默认为false,在false的情况下调试该APP,就会报以下错误:

    Device XXX requires that applications explicitely declare themselves as debuggable in their manifest.

    Application XXX does not have the attribute ‘debuggable’ set to TRUE in its manifest and cannot be debugged.

  • android:supportsRtl:这个是为了做地区适配的,RTL即从右向左布局,Android4.2支持原生RTL,有些语言,例如阿拉伯语,它的阅读习惯是从左向右的,为了优雅的更改布局方向,直接在application中设置android:supportsRtl=”true”即可。
  • android:largeHeap:让应用能申请使用更多的内存,我们知道安卓系统对于每个应用都有内存使用的限制,机器的内存限制,
  • android:permission:设置许可名,这个属性若在上定义的话,是一个给应用程序的所有组件设置许可的便捷方式,当然它是被各组件设置的许可名所覆盖的
  • android:presistent:该应用程序是否应该在任何时候都保持运行状态,默认为false。因为应用程序通常不应该设置本标识,持续模式仅仅应该设置给某些系统应用程序才是有意义的。
  • android:process:应用程序运行的进程名,它的默认值为元素里设置的包名,当然每个组件都可以通过设置该属性来覆盖默认值。如果你想两个应用程序共用一个进程的话,你可以设置他们的android:process相同,但前提条件是他们共享一个用户ID及被赋予了相同证书的时候

    -android:restoreAnyVersion同样也是android2.2的一个新特性,用来表明应用是否准备尝试恢复所有的备份,甚至该备份是比当前设备上更要新的版本,默认是false

    -android:taskAffinity拥有相同的affinity的Activity理论上属于相同的Task,应用程序默认的affinity的名字是元素中设定的package名

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"] >   
</activity>
           
  • android:alwaysRetainTaskState:是否保留状态不变, 比如切换回home, 再重新打开,activity处于最后的状态。比如一个浏览器拥有很多状态(当打开了多个TAB的时候),用户并不希望丢失这些状态时,此时可将此属性设置为true
  • android:clearTaskOnLaunch :比如 P是 activity, Q是被P触发的 activity, 然后返回Home, 重新启动P,是否显示Q
  • android:configChanges:当配置清单发生修改时, 是否调用 onConfigurationChanged() 方法 比如 “locale|navigation|orientation”。主要用来看手机方向改变的. android手机在旋转后,layout会重新布局, 正常情况下. 如果手机旋转了.当前Activity后杀掉,然后根据方向重新加载这个Activity. 就会从onCreate开始重新加载,如果你设置了 这个选项, 当手机旋转后,当前Activity之后调用onConfigurationChanged() 方法. 而不跑onCreate方法等.
  • android:excludeFromRecents:是否可被显示在最近打开的activity列表里,默认是false
  • android:finishOnTaskLaunch:当用户重新启动这个任务的时候,是否先关闭已打开的activity,默认是false
  • android:launchMode:Activity启动模式,【standard、singleTop、singleTask、singleInstance】默认为standard;详情请百度。
  • android:multiprocess:是否允许多进程,默认是false
  • android:noHistory:当用户从Activity上离开并且它在屏幕上不再可见时,Activity是否从Activity stack中清除并结束。默认是false。Activity不会留下历史痕迹
  • android:stateNotNeeded:activity被销毁或者成功重启时是否保存状态
  • android:screenOrientation:activity显示的模式,
    • unspecified 由系统自动判断显示方向
    • landscape 横屏模式,宽度比高度大
    • portrait 竖屏模式, 高度比宽度大
    • user模式,用户当前首选的方向
    • behind模式:和该Activity下面的那个Activity的方向一致(在Activity堆栈中的)
    • sensor模式:有物理的感应器来决定。如果用户旋转设备这屏幕会横竖屏切换
    • nosensor模式:忽略物理感应器,这样就不会随着用户旋转设备而更改了
    android:windowSoftInputMode:activity主窗口与软键盘的交互模式,可以用来避免输入法面板遮挡问题,Android1.5后的一个新特性。
    • stateUnspecified:软键盘的状态并没有指定,系统将选择一个合适的状态或依赖于主题的设置
    • stateUnchanged:当这个activity出现时,软键盘将一直保持在上一个activity里的状态,无论是隐藏还是显示
    • stateHidden:用户选择activity时,软键盘总是被隐藏
    • stateAlwaysHidden:当该Activity主窗口获取焦点时,软键盘也总是被隐藏的
    • stateVisible:软键盘通常是可见的
    • stateAlwaysVisible:用户选择activity时,软键盘总是显示的状态
    • adjustUnspecified:默认设置,通常由系统自行决定是隐藏还是显示
    • adjustResize:该Activity总是调整屏幕的大小以便留出软键盘的空间
    • adjustPan:当前窗口的内容将自动移动以便当前焦点从不被键盘覆盖和用户能总是看到输入内容的部分

intent-filter: 属性

<meta-data android:name="string"
           android:resource="resource specification"
           android:value="string"/>
           
  • android:name(解释:元数据项的名字,为了保证这个名字是唯一的,采用java风格的命名规范,如com.woody.project.fried)
  • android:resource(解释:资源的一个引用,指定给这个项的值是该资源的id。该id可以通过方法Bundle.getInt()来从meta-data中找到。)
  • android:value(解释:指定给这一项的值。可以作为值来指定的数据类型并且组件用来找回那些值的Bundle方法:[getString],[getInt],[getFloat],[getLong],[getBoolean])

activity-alias:属性

<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/> 
<meta-data/>
</activity-alias>

是为activity创建快捷方式的,如下实例:

<activity android:name=".shortcut">

            <intent-filter>

                <action android:name="android.intent.action.MAIN" />

            </intent-filter>

</activity>

 <activity-alias android:name=".CreateShortcuts" android:targetActivity=".shortcut" android:label="@string/shortcut">

    <intent-filter>

             <action android:name="android.intent.action.CREATE_SHORTCUT" />

             <category android:name="android.intent.category.DEFAULT" />

     </intent-filter>

 </activity-alias>
           

其中android.targetActivity是指向对应快捷方式的activity,如上述的shortcut(此Activity名)

android:label是指快捷方式的名称,而快捷方式的图标默认是给定的application图标

Service:

  1. service与activity同级,与activity不同的是,它不能自己启动的,运行在后台的程序,如果我们退出应用时,Service进程并没有结束,它仍然在后台运行。比如听音乐,网络下载数据等,都是由service运行的
  2. service生命周期:Service只继承了onCreate(),onStart(),onDestroy()三个方法,第一次启动Service时,先后调用了onCreate(),onStart()这两个方法,当停止Service时,则执行onDestroy()方法,如果Service已经启动了,当我们再次启动Service时,不会在执行onCreate()方法,而是直接执行onStart()方法
  3. service与activity间的通信:Service后端的数据最终还是要呈现在前端Activity之上的,因为启动Service时,系统会重新开启一个新的进程,这就涉及到不同进程间通信的问题了(AIDL),Activity与service间的通信主要用IBinder负责。
<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">

</service>
           

service标签内的属性之前已有描述,在此不重复了。

Receiver

四大组件之一,广播,属性与service一样。

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

contentProvider内容提供者,四大组件之一。

  1. android:authorities:列出一个或者多个由content provider的提供的URI的authorities。多个authorities由分号隔开。为了避免冲突,authority的命名规则应该遵循java的编码惯例(例如使用com.example.provider.cartoonprovider作为authority),通常情况authority的名字就是实现了provider的一个子类的名称。authority没有默认值,必须显式的指定
  2. android:enabled:该属性表明了该content provider是否可以被实例化。默认为true
  3. android:exported:该属性指示了content provider是否可以被其他应用程序使用。
  4. android:grantUriPermissions:该属性用于标识哪些没有数据访问权限的应用程式是否可以访问该数据。当该值为true时,并且有其他应用访问该content provider提供的数据是,依据readPermission 和writePermission中的规则给出限制。默认为false
  5. android:icon:设置content provider的图标资源。如果没有设置,则默认为< application>的图标
  6. android:initOrder:对于处在同一进程中的不同content provider来说,该属性值代表了不同content provider之间的初始化顺序。当不同的content provider之间有相互依赖时,设置该属性之后,可以确保相互依赖的content provider被按照一定的顺序创建。该属性的值为整数,并且数值越大优先级越高
  7. android:label:代表可读的content provider标签。如果该属性尚未设置,则默认为< application>的label标签。该属性的值为字符串,因此该属性同样也是可以参照不同的语言环境来进行切换的。但是为了方便开发,该属性通常被设置为一个常量的不可变的字符串
  8. android:multiprocess:该content provider 是否可以被任意一个进程实例化(默认值为false)
  9. android:name:该属性代表实现了content provider的类的名称,也就是ContentProvider的子类。该属性应该是一个类的全名称(例如:com.example.project.TransportationProvider)。但是当我们在< manifest>中指定了完整的包名。此时也可以使用.TransportationProvider来代替。 该属性没有默认值,必须指定
  10. android:permission:读写该content provider数据的权限的名称。这个属性很方便的规定了读和写两种权限。但是readPermission和writePermission的优先级要高于该属性的优先级。如果readPermission 设置的值,用于控制查询content provider的数据;writePermission设置的值,用于控制修改content provider的数据。
  11. android:process该content provide应该运行在哪个进程中。通常情况下application的所有组件都运行在一个由application创建的默认认的进程中。content provider的该属性值和application的相同。< application> 标签中的process属性可以左右其所有子组件的默认值,但是每个子组件同样是可以覆盖< application> 标签的该属性的。进而允许你的应用跨进程通信。如果这个分配的名称以冒号:开始,那么当它需要运行在哪个进程的时候,一个新的,私有的进程就被创建。如果这个进程名称以小写字母开始,那么这个provider将运行在全局进程中。这就允许这个进程在不同的应用中共享,进而降低对资源的消耗。
  12. android:readPermission:客户端读取content provider数据所需的权限。
  13. android:syncable:content provider的数据是否要和服务数据进行同步,若同步则为true,否则为false。
  14. android:writePermission:客户端修改由content provider控制的数据时所需的权限。

uses-library

用户库,可自定义。所有android的包都可以引用

supports-screens

<supports-screens  android:smallScreens=["true" | "false"] 
                  android:normalScreens=["true" | "false"] 
                  android:largeScreens=["true" | "false"] 
                  android:anyDensity=["true" | "false"] />
           

支持多屏幕机制

各属性含义:这四个属性,是否支持大屏,是否支持中屏,是否支持小屏,是否支持多种不同密度

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

<uses-sdk android:minSdkVersion="integer"
          android:targetSdkVersion="integer"
          android:maxSdkVersion="integer"/>
           

描述应用所需的api level,就是版本。在此属性中可以指定支持的最小版本,目标版本以及最大版本

instrumentation

<instrumentation android:functionalTest=["true" | "false"]
                 android:handleProfiling=["true" | "false"]
                 android:icon="drawable resource"
                 android:label="string resource"
                 android:name="string"
                 android:targetPackage="string"/>
           

定义一些用于探测和分析应用性能等等相关的类,可以监控程序。在各个应用程序的组件之前instrumentation类被实例化

android:functionalTest(解释:instrumentation类是否能运行一个功能测试,默认为false)

permission

声明用户权限。