android  AndroidManifest.xml 文件介绍 AndroidManifest.xml 是每一个应用都需要文件, 位于应用根目录下,它 描述了程序包 全局变量, 包括暴露应用组件(activities, services 等等)和为每个组件实现类, 什么样 数据可以操作, 以及在什么地方运行。 主要包括以下各个元素。 A.包名(package):指定本应用内 java 主程序包包名。当没有指定 apk 文件名时,编译后 产生程序包将以此命名。本包名应当在Android 系统运行时唯一。 B. 认 证 (certificate): 指 定 本 应 用 程 序 所 授 予  信 任 级 别 , 目 前 有 认 证 级 别 有 platform(system)、shared、media 以及应用自定义认证。不同认证可以享受不同权限。 C.权限组(permission-group):权限组定义是为了描述一组具有共同特性权限。 D.权限(permission):权限用来描述是否拥有做某件事权力。Android 系统中权限是分级, 前分为普通级别(Normal),危险级别(dangerous),签名级别(signature)和系统/签名级别 (signature or system)。系统中所有预定义权限根据作用不同,分别属于不同级别。对 于普通和危险级别权限,我们称之为低级权限,应用申请即授予。其他两级权限,我们称 之为高级权限或系统权限, 应用拥有 platform 级别认证才能申请。 当应用试图在没有权限 情况下做受限操作,应用将被系统杀掉以警示。系统应用可以使用任何权限。权限声明 者可无条件使用该权限。 E.权限树(permission-tree)权限树设置是为了统一管理一组权限, 声明于该树下权限所有 者 归 属 该 应 用 。 系 统 提 供 了 API , 应 用 可 以 在 运 行 时 动 态 添 加 。 PackageManager.addPermission() F.使用权限(uses-permission):应用需要权限应当在此处申请,所申请权限应当被系统或 某个应用所定义,否则视为无效申请。同时,使用权限申请需要遵循权限授予条件,非 platform 认证应用无法申请高级权限。 G:SDK(uses-sdk):标识本应用运行 SDK 版本。高兼容性应用可以忽略此项。 H.application:application 是 Android 应用内最高级别(top level)模块,每个应用内最多只能 有一个 application, 如果应用没有指定该模块, 一个默认 application 将被启用。 application 将在应用启动时最先被加载, 并存活在应用整个运行时生命周期。 因此一些初始化工作 适合在本模块完成. Application 元素有许多属性,其中: “persistent”表示本应用是否为常驻 内存, “enable”表示本应用当前是否应当被加载。 <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".HelloOPhone" android:label="@string/app_name"> <intent-filter> <actionandroid:name="android.intent.action.MAIN" /> <categoryandroid:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> 在AndroidManifest.xml 文件中, 运行时模块定义都作为本模块子元素。 当运行时模块被 调度时,如果应用没有启动,将首先启动应用进行初始化,然后调度对应模块。 I.activity:activity 是 application 模块运行时子元素,标识了一个 UI。除了 application,一个 应用可以声明并实现零至多个其它运行时模块,activity 也同样。activity 也包含了许多定义 它工作状态属性,其中: “name”是必须,它指定了该 activity 所在文件名,如果该 文件所属包不同于该应用包名(即本描述文件最开始处) ,那么名字前面需要加入所在 包名。 activity 通过增加 intent-fliter 来标识哪些 intent 可以被处理, 同时 intent 也是调度 activity 主要参数。 J.receiver:receiver 也是 application 运行时子元素。receiver 通过增加 intent-fliter 来标识它 需要接受哪些 intent。当收到 intent 后,receiver 将根据不同 intent 进行不同处理。当一 个 Intent 发出后,所有注册了该 intent  receiver 都将会收到,系统会根据 receiver 在系统 中注册次序顺序发送。当一个 receiver 处理完该 Intent 后,系统才会向下一个 receiver 发 送。当一个 receiver 有多个未接收 intent 时,将按照 intent 发送次序顺序接收。 在本实例中,intent-filter 如下: <actionandroid:name="android.intent.action.MAIN" /> <categoryandroid:name="android.intent.category.LAUNCHER" /> K.service:service 也是 application 运行时子元素。Service 属于后台模块,启动后将长时间 运行,除非停止该 service 或所在应用进程被杀死。 L.provider:provider 也是 application 运行时子元素。 它继承于 ContentProvider, 是对该应用 管理用户数据结构化接入, 是基于数据库操作方式封装。 如果应用允许外部应用访问 /管理它用户数据,provider 是 Android 平台提供最佳方式。 M.activity-alias:顾名思义,是已有 activity 别名。 N:uses-library:标识应用启动所必须共享库。 AndroidManifest.xml 解析 一) 解析(一 一、关于AndroidManifest.xml AndroidManifest.xml 是每个 android 程序中必须文件。它位于整个项目根目录,描述了 package 中暴 露组件(activities, services, 等等),他们各自实现类,各种能被处理数据和启动位置。 除了能声 明程序中 Activities, ContentProviders, Services, 和 Intent Receivers,还能指定 permissions 和 instrumentation(安全控制和测试) 二、AndroidManifest.xml 结构 <?xmlversion="1.0"encoding="utf-8"?> <manifest> <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> <uses-permission/> <permission/> <permission-tree/> <permission-group/> <instrumentation/> <uses-sdk/> <uses-configuration/> <uses-feature/> <supports-screens/> </manifest> 三、各个节点详细介绍 上面就是整个 am(androidManifest).xml 结构,下面以外向内开始阐述~~ 1、第一层(<Manifest>):(属性) <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.woody.test" android:sharedUserId="string" android:sharedUserLabel="string resource"android:versionCode="integer" android:versionName="string" android:installLocation=["auto" | "internalOnly" | "preferExternal"] > </manifest> A、xmlns:android 定义 android 命名空间,一般为 http://schemas.android.com/apk/res/android, 这样使得 Android 中各种标准 属性能在文件中使用,提供了大部分元素中数据。 B、package 指定本应用内 java 主程序包包名,它也是一个应用进程默认名称 C、sharedUserId 表明数据权限,因为默认情况下,Android 给每个 APK 分配一个唯一 UserID, 所以是默认禁止不同 APK 访问共享数据。若要共享数据,第一可以采用 Share Preference 方法,第二种就可以采用 sharedUserId 了,将不同 APK  sharedUserId 都设为一样,则这些 APK 之间就可以互相共享数据了。详见: http://wallage.blog.163.com/blog/static/17389624201011010539408/ D、sharedUserLabel 一个共享用户名,它只有在设置了 sharedUserId 属性前提下才会有意义 E、versionCode 是给设备程序识别版本(升级)用必须是一个 interger 值代表 app 更新过多少 次,比如第一版一般为 1,之后若要更新版本就设置为 2,3 等等。。。 F、versionName 这个名称是给用户看,你可以将你 APP 版本号设置为 1.1 版,后续更新版本 设置为 1.2、2.0 版本等等。。。 G、installLocation 安装参数,是 Android2.2 中一个新特性,installLocation 有三个值可以选 择:internalOnly、auto、preferExternal 选择 preferExternal,系统会优先考虑将 APK 安装到 SD 卡上(当然最终用户可以 选择为内部 ROM 存储上,如果 SD 存储已满,也会安装到内部存储上) 选择 auto,系统将会根据存储空间自己去适应 选择 internalOnly 是指必须安装到内部才能运行 (注:需要进行后台类监控 APP 最好安装在内部,而一些较大游戏 APP 最好 安装在 SD 卡上。现默认为安装在内部,如果把 APP 安装在 SD 卡上,首先得设置 你 level 为 8,并且要配置android:installLocation 这个参数属性为 preferExternal) 2、第二层(<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> A、android:allowClearUserData('true' or 'false') 用户是否能选择自行清除数据,默认为 true,程序管理器包含一个选择允许用 户清除数据。当为 true 时,用户可自己清理用户数据,反之亦然 B、android:allowTaskReparenting('true' or 'false') 是否允许 activity 更换从属任务,比如从短信息任务切换到浏览器任务 C、android:backupAgent 这也是 Android2.2 中一个新特性,设置该 APP 备份,属性值应该是一个完 整类名,如 com.project.TestCase,此属性并没有默认值,并且类名必须得 指定(就是个备份工具,将数据备份到云端操作) D、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. E、android:description/android:label 此两个属性都是为许可提供,均为字符串资源,当用户去看许可列表 (android:label)或者某个许可详细信息(android:description)时, 这些字符 串资源就可以显示给用户。label 应当尽量简短,只需要告知用户该许可是在保 护什么功能就行。 description 可以用于具体描述获取该许可程序可以做哪 而 些事情,实际上让用户可以知道如果他们同意程序获取该权限话,该程序可以 做什么。我们通常用两句话来描述许可,第一句描述该许可,第二句警告用户如 果批准该权限会可能有什么不好事情发生 F、android:enabled Android 系统是否能够实例化该应用程序组件,如果为 true,每个组件 enabled 属性决定那个组件是否可以被 enabled。如果为 false,它覆盖组件指 定值;所有组件都是 disabled。 G、android:hasCode('true' or 'false') 表示此 APP 是否包含任何代码,默认为 true,若为 false,则系统在运行组件 时,不会去尝试加载任何 APP 代码 一个应用程序自身不会含有任何代码,除非内置组件类,比如 Activity 类, 此类使用了 AliasActivity 类,当然这是个罕见现象 (在 Android2.3 可以用标准 C 来开发应用程序, 可在 androidManifest.xml 中将 此属性设置为 false,因为这个 APP 本身已经不含有任何 JAVA 代码了) H、android:icon 这个很简单,就是声明整个 APP 图标,图片一般都放在 drawable 文件夹下 I、android:killAfterRestore J、android:manageSpaceActivity K、android:name 为应用程序所实现 Application 子类全名。当应用程序进程开始时,该类在 所有应用程序组件之前被实例化。 若该类(比方 androidMain 类)是在声明 package 下,则可以直接声明android:name="androidMain",但此类是在 package 下面子包话,就必须声 明为全路径或android:name="package 名称.子包名成.androidMain" L、android:permission 设置许可名,这个属性若在<application>上定义话,是一个给应用程序所 有组件设置许可便捷方式,当然它是被各组件设置许可名所覆盖 M、android:presistent 该应用程序是否应该在任何时候都保持运行状态,默认为 false。因为应用程序 通常不应该设置本标识, 持续模式仅仅应该设置给某些系统应用程序才是有意义 。 N、android:process 应用程序运行进程名,它默认值为<manifest>元素里设置包名,当然每个 组件都可以通过设置该属性来覆盖默认值。 如果你想两个应用程序共用一个进程 话,你可以设置他们android:process 相同,但前提条件是他们共享一个用 户 ID 及被赋予了相同证书时候 O、android:restoreAnyVersion 同样也是 android2.2 一个新特性,用来表明应用是否准备尝试恢复所有备 份,甚至该备份是比当前设备上更要新版本,默认是 false P、android:taskAffinity 拥有相同affinity  Activity 理论上属于相同 Task,应用程序默认 affinity 名字是<manifest>元素中设定package 名 Q、android:theme 是一个资源风格,它定义了一个默认主题风格给所有 activity,当然也可 以在自己 theme 里面去设置它,有点类似 style。 (注:有关于 theme 资源网址,请参见:http://www.android-theme.org/ ) 3、第三层(<Activity>):属性 <activityandroid: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> (注:有些在 application 中重复就不多阐述了) 1、android:alwaysRetainTaskState 是否保留状态不变, 比如切换回 home, 再从新打开,activity 处于最后状态。比如一个浏览器拥有很多 状态(当打开了多个 TAB 时候),用户并不希望丢失这些状态时,此时可将此属性设置为 true 2、android:clearTaskOnLaunch 比如 P 是 activity, Q 是被 P 触发 activity, 然后返回 Home, 重新启动 P,是否显示 Q 3、android:configChanges 当配置 list 发生修改时,是否调用 onConfigurationChanged() 方法 比如 "locale|navigation|orientation". 这个我用过,主要用来看手机方向改变. android 手机在旋转后,layout 会重新布局, 如何做到呢? 正常情况下. 如果手机旋转了.当前 Activity 后杀掉,然后根据方向重新加载这个 Activity. 就会从 onCreate 开始重新加载. 如果你设置了 这个选项, 当手机旋转后,当前 Activity 之后调用 onConfigurationChanged() 方法. 而不跑 onCreate 方法等. 4、android:excludeFromRecents 是否可被显示在最近打开 activity 列表里,默认是 false 5、android:finishOnTaskLaunch 当用户重新启动这个任务时候,是否关闭已打开 activity,默认是 false 如果这个属性和 allowTaskReparenting 都是 true,这个属性就是王牌。 Activity 亲和力将被忽略。 Activity 该 已经被摧毁并非 re-parented 6、android:launchMode(Activity 加载模式) 在多 Activity 开发中,有可能是自己应用之间 Activity 跳转,或者夹带其他应用可复用 Activity。可能 会希望跳转到原来某个 Activity 实例,而不是产生大量重复 Activity。这需要为 Activity 配置特定加载 模式,而不是使用默认加载模式 Activity 有四种加载模式: standard、singleTop、singleTask、singleInstance(其中前两个是一组、后两个是一组),默认为 standard standard:就是 intent 将发送给新实例,所以每次跳转都会生成新 activity。 singleTop:也是发送新实例,但不同 standard 一点是,在请求 Activity 正好位于栈顶时(配置成 singleTop  Activity),不会构造新实例 singleTask:和后面 singleInstance 都只创建一个实例,当 intent 到来,需要创建设置为 singleTask  Activity 时候,系统会检查栈里面是否已经有该 Activity实例。如果有直接将 intent 发送给它。 singleInstance: 首先说明一下 task 这个概念,Task 可以认为是一个栈,可放入多个 Activity。比如启动一个应用,那么 Android 就创建了一个 Task,然后启动这个应用入口 Activity,那在它界面上调用其他 Activity 也只 是在这个 task 里面。那如果在多个 task 中共享一个 Activity 话怎么办呢。举个例来说,如果开启一个导 游服务类应用程序,里面有个 Activity 是开启 GOOGLE 地图,当按下 home 键退回到主菜单又启动 GOOGLE 地图应用时,显示就是刚才地图,实际上是同一个 Activity,实际上这就引入了 singleInstance。 singleInstance 模式就是将该 Activity 单独放入一个栈中, 这样这个栈中只有这一个 Activity, 不同应用 intent 都由这个 Activity 接收和展示,这样就做到了共享。当然前提是这些应用都没有被销毁, 所以刚才是按下 HOME 键,如果按下了返回键,则无效 7、android:multiprocess 是否允许多进程,默认是 false 具体可看该篇文章:http://www.bangchui.org/simple/?t3181.html 8、android:noHistory 当用户从 Activity 上离开并且它在屏幕上不再可见时,Activity 是否从 Activity stack 中清除并结束。默认是 false。Activity 不会留下历史痕迹 9、android:screenOrientation activity 显示模式 默认为 unspecified:由系统自动判断显示方向 landscape 横屏模式,宽度比高度大 portrait 竖屏模式, 高度比宽度大 user 模式,用户当前首选方向 behind 模式:和该 Activity 下面那个 Activity 方向一致(在 Activity 堆栈中) sensor 模式:有物理感应器来决定。如果用户旋转设备这屏幕会横竖屏切换 nosensor 模式:忽略物理感应器,这样就不会随着用户旋转设备而更改了 10、android:stateNotNeeded activity 被销毁或者成功重启时是否保存状态 11、android:windowSoftInputMode activity 主窗口与软键盘交互模式,可以用来避免输入法面板遮挡问题,Android1.5 后一个新特性。 这个属性能影响两件事情: 【A】当有焦点产生时,软键盘是隐藏还是显示 【B】是否减少活动主窗口大小以便腾出空间放软键盘 各值含义: 【A】stateUnspecified:软键盘状态并没有指定,系统将选择一个合适状态或依赖于主题设置 【B】stateUnchanged:当这个 activity 出现时,软键盘将一直保持在上一个 activity 里状态,无论是隐 藏还是显示 【C】stateHidden:用户选择 activity 时,软键盘总是被隐藏 【D】stateAlwaysHidden:当该 Activity 主窗口获取焦点时,软键盘也总是被隐藏 【E】stateVisible:软键盘通常是可见 【F】stateAlwaysVisible:用户选择 activity 时,软键盘总是显示状态 【G】adjustUnspecified:默认设置,通常由系统自行决定是隐藏还是显示 【H】adjustResize:该 Activity 总是调整屏幕大小以便留出软键盘空间 【I】adjustPan:当前窗口内容将自动移动以便当前焦点从不被键盘覆盖和用户能总是看到输入内容 部分 4、第四层(<intent-filter>) 结构图: <intent-filter android:icon="drawable resource" android:label="string resource"android:priority="integer"> <action /> <category /> <data /> </intent-filter> intent-filter 属性android:priority(解释:有序广播主要是按照声明优先级别,如 A 级别高于 B,那么,广播先传给 A, 再传给 B。优先级别就是用设置 priority 属性来确定,范围是从-1000~1000,数越大优先级别越高) Intent filter 内会设定资料包括 action,data 与 category 三种。也就是说 filter 只会与 intent 里这三种资 料作对比动作 action 属性 action 很简单,只有 android:name 这个属性。常见 android:name 值为android.intent.action.MAIN,表 明此 activity 是作为应用程序入口。有关 android:name 具体有哪些值,可参照这个网址: http://hi.baidu.com/linghtway/blog/item/83713cc1c2d053170ff477a7.html category 属性 category 也只有 android:name 属性。常见 android:name 值为 android.intent.category.LAUNCHER(决 定应用程序是否显示在程序列表里) 有关 android:name 具体有哪些值,可参照这个网址:http://chroya.javaeye.com/blog/685871 data 属性 <data android:host="string"android:mimeType="string" android:path="string" android:pathPattern="string"android:pathPrefix="string" android:port="string" android:scheme="string"/> 【1】每个<data>元素指定一个 URI 和数据类型(MIME 类型)。它有四个属性 scheme、host、port、path 对应于 URI 每个部分: scheme://host:port/path scheme 值一般为"http",host 为包名,port 为端口号,path 为具体地址。如: http://com.test.project:200/folder/etc 其中 host 和 port 合起来构成 URI 凭据(authority),如果 host 没有指定,则 port 也会被忽略 要让 authority 有意义,scheme 也必须要指定。要让 path 有意义,scheme+authority 也必须要指定 【2】mimeType(指定数据类型),若 mimeType 为'Image',则会从 content Provider 指定地址中获取 p_w_picpath 类型数据。还有'video'啥,若设置为 video/mp4,则表示在指定地址中获取 mp4 格式 video 文件 【3】而 pathPattern 和 PathPrefix 主要是为了格式化 path 所使用 5、第四层<meta-data> <meta-data android:name="string" android:resource="resource specification" android:value="string"/> 这是该元素基本结构.可以包含在<activity> <activity-alias> <service> <receiver>四个元素中。 android:name(解释:元数据项名字,为了保证这个名字是唯一,采用 java 风格命名规范,如 com.woody.project.fried) android:resource(解释:资源一个引用,指定给这个项值是该资源 id。该 id 可以通过方法 Bundle.getInt()来从 meta-data 中找到。) android:value(解释: 指定给这一项值。 可以作为值来指定数据类型并且组件用来找回那些值 Bundle 方法:[getString],[getInt],[getFloat],[getString],[getBoolean]) 6、第三层<activity-alias>属性 <activity-aliasandroid: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-alias>是为 activity 创建快捷方式,如下实例: <activity android:name=".shortcut"> <intent-filter> <actionandroid:name="android.intent.action.MAIN" /> </intent-filter> </activity> <activity-aliasandroid:name=".CreateShortcuts" android:targetActivity=".shortcut" android:label="@string/shortcut"> <intent-filter> <action android:name="android.intent.action.CREATE_SHORTCUT" /> <categoryandroid:name="android.intent.category.DEFAULT" /> </intent-filter> </activity-alias> 其中android.targetActivity 是指向对应快捷方式 activity,如上述 shortcut(此 Activity 名) android:label 是指快捷方式名称,而快捷方式图标默认是给定 application 图标 AndroidManifest.xml 解析 三) 解析(三 7、第三层<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 负责。具 体可参照:http://zhangyan1158.blog.51cto.com/2487362/491358 【4】 <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 标签内属性之前已有描述,在此不重复了~ 8、第三层<receiver> receiver 属性与 service 一样,这里就不显示了 BroadcastReceiver:用于发送广播,broadcast 是在应用程序之间传输信息一种机制,而 BroadcastReceiver 是对发送出来 Broadcast 进行过滤接受并响应一类组件,具体参照 http://kevin2562.javaeye.com/blog/686787 9、第三层<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> contentProvider(数据存储) 【1】android:authorities: 标识这个 ContentProvider,调用者可以根据这个标识来找到它 【2】android:grantUriPermission: 对某个 URI 授予权限 【3】android:initOrder 10、第三层<uses-library> 用户库,可自定义。所有 android 包都可以引用 11、第一层<supports-screens> <supports-screens android:smallScreens=["true" | "false"] android:normalScreens=["true" | "false"]android:largeScreens=["true" | "false"] android:anyDensity=["true" | "false"] /> 这是在 android1.6 以后新特性,支持多屏幕机制 各属性含义:这四个属性,是否支持大屏,是否支持中屏,是否支持小屏,是否支持多种不同密度 12、第二层<uses-configuration />与<uses-feature>性能都差不多 <uses-configurationandroid: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"] /> 这两者都是在描述应用所需要硬件和软件特性,以便防止应用在没有这些特性设备上安装。 13、第二层<uses-sdk /> <uses-sdk android:minSdkVersion="integer"android:targetSdkVersion="integer" android:maxSdkVersion="integer"/> 描述应用所需 api level, 就是版本, 目前是 android 2.2 = 8, android2.1 = 7, android1.6 = 4, android1.5=3 在此属性中可以指定支持最小版本,目标版本以及最大版本 14、第二层<instrumentation /> <instrumentationandroid: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) 15、<permission>、<uses-permission>、<permission-tree />、<permission-group />区别~ 最常用当属<uses-permission>,当我们需要获取某个权限时候就必须在我们 manifest 文件中声明, 此<uses-permission>与<application>同级,具体权限列表请看此处 通常情况下我们不需要为自己应用程序声明某个权限, 除非你提供了供其他应用程序调用 代码或者数据。这个时候你才需要使用<permission> 这个标签。很显然这个标签可以 让我们声明自己权限。比如: <permissionandroid:name="com.teleca.project.MY_SECURITY" . . . /> 那么在 activity 中就可以声明该自定义权限了,如: <application . . .> <activity android:name="XXX" . . . >android:permission="com.teleca.project.MY_SECURITY"> </activity> </application> 当然自己声明permission 也不能随意使用,还是需要使用<uses-permission>来声明你需要该权限 <permission-group> 就是声明一个标签,该标签代表了一组 permissions,而<permission-tree>是为一组 permissions 声明了一个 namespace。这两个标签可以看之前系列文章。