android 的 AndroidManifest.xml 文件介绍
来源:未知 责任编辑:智问网络 发表时间:2013-10-30 11:04 点击:次
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 的指定地址中获取 image 类型的数据。还有'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。这两个标签可以看之前的系列文章。
相关新闻>>
最新推荐更多>>>
- 发表评论
-
- 最新评论 更多>>