理解《Android的AndroidManifest.xml》
三、AndroidManifest.xml 属性
第一层(< Manifest >):(属性)
xmlns:android:定义android命名空间,一般为http://schemas.android.com/apk/res/android,这样使得Android中各种标准属性能在文件中使用,提供了大部分元素中的数据。
package:指定本应用内java主程序包的包名,它也是一个应用进程的默认名称。
sharedUserId:表明数据权限,因为默认情况下,Android给每个APK分配一个唯一的UserID,所以是默认禁止不同APK访问共享数据的。若要共享数据,第一可以采用Share Preference方法,第二种就可以采用sharedUserId了,将不同APK的sharedUserId都设为一样,则这些APK之间就可以互相共享数据了。
sharedUserLabel:一个共享的用户名,它只有在设置了sharedUserId属性的前提下才会有意义。
versionCode:是给设备程序识别版本(升级)用的必须是一个interger值代表app更新过多少次,比如第一版一般为1,之后若要更新版本就设置为2,3等等。。。
versionName:这个名称是给用户看的,你可以将你的APP版本号设置为1.1版,后续更新版本设置为1.2、2.0版本等等。。。
installLocation:安装参数,是Android2.2中的一个新特性,installLocation有三个值可以选择:internalOnly、auto、preferExternal;
选择preferExternal,系统会优先考虑将APK安装到SD卡上(当然最终用户可以选择为内部ROM存储上,如果SD存储已满,也会安装到内部存储上);
选择auto,系统将会根据存储空间自己去适应;
选择internalOnly是指必须安装到内部才能运行;
(注:需要进行后台类监控的APP最好安装在内部,而一些较大的游戏APP最好安装在SD卡上。现默认为安装在内部,如果把APP安装在SD卡上,首先得设置你的level为8,并且要配置android:installLocation这个参数的属性为preferExternal)。
第二层(< 基本配置 >):(属性)
uses-permission :最经常使用的权限设定标签,我们通过设定android:name属性来声明相应的权限名。
<manifest ...> ... ... <!-- 网络相关功能 --> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <!-- 读取电话状态 --> <uses-permission android:name="android.permission.READ_PHONE_STATE"/> <!-- 通知相关功能 --> <uses-permission android:name="android.permission.VIBRATE" /> ... ... </manifest>
permission:权限声明标签,定义了供给< uses-permission >使用的具体权限,通常情况下我们不需要为自己的应用程序声明某个权限,除非需要给其他应用程序提供可调用的代码或者数据,这个时候你才需要使用< permission >标签。该标签中提供了android:name权限名标签,权限图标android:icon以及权限描述android:description等属性,另外还可以和< permission-group >以及< permission-tree >配合使用来构造更有层次的、更有针对性权限系统。
<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"] />
Instrumentation:用于声明Instrumentation测试类来监控Android应用的行为并应用到相关的功能测试中,其中比较重要的属性有:测试功能开关android:functionalTest,profiling调试功能开关android:handleProfiling,测试用例目标对象android:targetPackage等。另外,我们需要注意的是Instrumentation对象是在应用程序的组件之前被实例化的,这点在组织测试逻辑的时候需要被考虑到。标签语法范例如下。
<instrumentation android:functionalTest=["true" | "false"] android:handleProfiling=["true" | "false"] android:icon="drawable resource" android:label="string resource" android:name="string" android:targetPackage="string" />
uses-sdk:描述应用所需的api level,就是版本。在此属性中可以指定支持的最小版本,目标版本以及最大版本。
<uses-sdk android:minSdkVersion="integer" android:targetSdkVersion="integer" android:maxSdkVersion="integer"/>
uses-configuration与uses-feature:这两个标签都是用于描述应用所需要的硬件和软件特性,以便防止应用在没有这些特性的设备上安装。< uses-configuration >标签中,比如有些设备带有D-pad或者Trackball这些特殊硬件,那么android:reqFiveWayNav属性就需要设置为true;而如果有一些设备带有硬件键盘,android:reqHardKeyboard也需要被设置为true。另外,如果设备需要支持蓝牙,我们可以使用< uses-feature android:name=”android.hardware.bluetooth” />来支持这个功能。这两个标签主要用于支持一些特殊的设备中的应用。
<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:name="string" android:required=["true" | "false"] android:glEsVersion="integer" />
用于指定Android应用可使用的用户库,除了系统自带的android.app、android.content、android.view和android.widget这些默认类库之外,有些应用可能还需要一些其他的Java类库作为支持,这种情况下我们就可以使用< uses-library >标签让ClassLoader加载其类库供Android应用运行时用。
<uses-library android:name="string" android:required=["true" | "false"] />
supports-screens:对于一些应用或者游戏来说,只能支持某些屏幕大小的设备或者在某些设备中的效果比较好,我们就会使用< supports-screens >标签来指定支持的屏幕特征。其中比较重要的属性包括:屏幕自适应属性android:resizeable,小屏(android:smallScreens)、中屏(android:normalScreens)、大屏(android:largeScreens)和特大屏(android:xlargeScreens)支持属性,按屏幕渲染图像属性android:anyDensity以及最小屏幕宽度属性android:requiresSmallestWidthDp等。
<supports-screens android:resizeable=["true"| "false"] 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"/>
第三层(< 应用属性 >):属性
< application >属性
应用配置的根元素,位于< manifest >下层,包含所有与应用有关配置的元素,其属性可以作为子元素的默认属性,常用的属性包括:应用名android:label,应用图标android:icon,应用主题android:theme等。
<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:allowClearUserData(‘true’ or ‘false’):用户是否能选择自行清除数据,默认为true,程序管理器包含一个选择允许用户清除数据。当为true时,用户可自己清理用户数据,反之亦然
android:allowTaskReparenting(‘true’ or ‘false’):是否允许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:description/android:label:此两个属性都是为许可提供的,均为字符串资源,当用户去看许可列表(android:label)或者某个许可的详细信息(android:description)时,这些字符串资源就可以显示给用户。label应当尽量简短,之需要告知用户该许可是在保护什么功能就行。而description可以用于具体描述获取该许可的程序可以做哪些事情,实际上让用户可以知道如果他们同意程序获取该权限的话,该程序可以做什么。我们通常用两句话来描述许可,第一句描述该许可,第二句警告用户如果批准该权限会可能有什么不好的事情发生。
android:enabled:Android系统是否能够实例化该应用程序的组件,如果为true,每个组件的enabled属性决定那个组件是否可以被 enabled。如果为false,它覆盖组件指定的值;所有组件都是disabled。
android:hasCode(‘true’ or ‘false’):表示此APP是否包含任何的代码,默认为true,若为false,则系统在运行组件时,不会去尝试加载任何的APP代码。
一个应用程序自身不会含有任何的代码,除非内置组件类,比如Activity类,此类使用了AliasActivity类,当然这是个罕见的现象。
(在Android2.3可以用标准C来开发应用程序,可在androidManifest.xml中将此属性设置为false,因为这个APP本身已经不含有任何的JAVA代码了)。
android:icon:声明整个APP的图标,图片一般都放在drawable文件夹下。
android:name:为应用程序所实现的Application子类的全名。当应用程序进程开始时,该类在所有应用程序组件之前被实例化。
若该类(比方androidMain类)是在声明的package下,则可以直接声明android:name=”androidMain”,但此类是在package下面的子包的话,就必须声明为全路径或android:name=”package名称.子包名成.androidMain”。
android:permission:设置许可名,这个属性若在< application >上定义的话,是一个给应用程序的所有组件设置许可的便捷方式,当然它是被各组件设置的许可名所覆盖的。
android:presistent:该应用程序是否应该在任何时候都保持运行状态,默认为false。因为应用程序通常不应该设置本标识,持续模式仅仅应该设置给某些系统应用程序才是有意义的。
android:process:应用程序运行的进程名,它的默认值为< manifest >元素里设置的包名,当然每个组件都可以通过设置该属性来覆盖默认值。如果你想两个应用程序共用一个进程的话,你可以设置他们的android:process相同,但前提条件是他们共享一个用户ID及被赋予了相同证书的时候。
android:restoreAnyVersion:同样也是android2.2的一个新特性,用来表明应用是否准备尝试恢复所有的备份,甚至该备份是比当前设备上更要新的版本,默认是false。
android:taskAffinity:拥有相同的affinity的Activity理论上属于相同的Task,应用程序默认的affinity的名字是< manifest >元素中设定的package名。
android:theme:是一个资源的风格,它定义了一个默认的主题风格给所有的activity,当然也可以在自己的theme里面去设置它,有点类似style。
< intent-filter >属性
< intent-filter >用于Intent消息过滤器的声明,Intent消息对于Android应用系统来说,是非常重要的“粘合剂”,< intent-filter >元素可以放在< activity >、< activity-alias >、< service >和< receiver >元素标签中,来区分可用于处理消息的Activity控制器、Service服务和广播接收器Broadcast Receiver。另外,我们还知道Intent消息还包含有名称、动作、数据、类别等几个重要属性。这点与该标签的写法也有一定的关系,比如< intent-filter >中必须包含有< action >元素,即用于描述具体消息的名称;< category >标签则用于表示能处理消息组件的类别,即该Action所符合的类别;而< data >元素则用于描述消息需要处理的数据格式,我们甚至还可以使用正则表达式来限定数据来源。
<intent-filter android:icon="drawable resource"
android:label="string resource"
android:priority="integer" >
<action android:name="string" />
<category android:name="string" />
<data android:host="string"
android:mimeType="string"
android:path="string"
android:pathPattern="string"
android:pathPrefix="string"
android:port="string"
android:scheme="string" />
</intent-filter>
intent-filter属性
android:priority(解释:有序广播主要是按照声明的优先级别,如A的级别高于B,那么,广播先传给A,再传给B。优先级别就是用设置priority属性来确定,范围是从-1000~1000,数越大优先级别越高)
Intent filter内会设定的资料包括action,data与category三种。也就是说filter只会与intent里的这三种资料作对比动作
action:只有android:name这个属性。常见的android:name值为android.intent.action.MAIN,表明此activity是作为应用程序的入口。
category 也只有android:name属性。常见的android:name值为android.intent.category.LAUNCHER(决定应用程序是否显示在程序列表里)
常见的Activity Action Intent常量 常量名称 常量值 意义 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.GET_CONTENT 显示打电话面板 ACITON_CALL android.intent.action.DIAL 直接打电话 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_FACTORY_TEST android.intent.action.FACTORY_TEST 工厂测试入口点 常见的BroadcastIntent Action常量 BroadcastIntent Action字符串常量 描述 ACTION_TIME_TICK 系统时间每过一分钟发出的广播 ACTION_TIME_CHANGED 系统时间通过设置发生了变化 ACTION_TIMEZONE_CHANGED 时区改变 ACTION_BOOT_COMPLETED 系统启动完毕 ACTION_PACKAGE_ADDED 新的应用程序apk包安装完毕 ACTION_PACKAGE_CHANGED 现有应用程序apk包改变 ACTION_PACKAGE_REMOVED 现有应用程序apk包被删除 ACTION_UID_REMOVED 用户id被删除 Intent的Action和Data属性匹配 Action属性 Data属性 说明 ACTION_VIEW content://contacts/people/1 显示id为1的联系人信息 ACTION_DIAL content://contacts/people/1 将id为1的联系人电话号码显示在拨号界面中 ACITON_VIEW tel:123 显示电话为123的联系人信息 ACTION_VIEW http://www.google.com 在浏览器中浏览该网站 ACTION_VIEW file://sdcard/mymusic.mp3 播放MP3 ACTION_VIEW geo:39.2456,116.3523 显示地图 常见的Category常量 Category字符串常量 描述 CATEGORY_BROWSABLE 目标Activity能通过在网页浏览器中点击链接而激活(比如,点击浏览器中的图片链接) CATEGORY_GADGET 表示目标Activity可以被内嵌到其他Activity当中 CATEGORY_HOME 目标Activity是HOME Activity,即手机开机启动后显示的Activity,或按下HOME键后显示的Activity CATEGORY_LAUNCHER 表示目标Activity是应用程序中最优先被执行的Activity CATEGORY_PREFERENCE 表示目标Activity是一个偏爱设置的Activity
data属性
<data android:host="string"
android:mimeType="string"
android:path="string"
android:pathPattern="string"
android:pathPrefix="string"
android:port="string"
android:scheme="string"/>
【1】每个元素指定一个URI和数据类型(MIME类型)。它有四个属性scheme、host、port、path对应于URI的每个部分:
scheme://host:port/path
scheme的值一般为”http”,host为包名,port为端口号,path为具体地址。
其中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所使用的
< meta-data >属性
用于存储预定义数据,和< intent-filter >类似,< meta-data >也可以放在< activity >、< activity-alias >、< service >和< receiver >这四个元素标签中。Meta数据一般会以键值对的形式出现,个数没有限制,而这些数据都将被放到一个Bundle对象中,程序中我们则可以使用ActivityInfo、ServiceInfo甚至ApplicationInfo对象的metaData属性中读取。
<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],[getString],[getBoolean]
< activity >属性
Activity活动组件(即界面控制器组件)的声明标签,Android应用中的每一个Activity都必须在AndroidManifest.xml配置文件中声明,否则系统将不识别也不执行该Activity。< activity >标签中常用的属性有:Activity对应类名android:name,对应主题android:theme,加载模式android:launchMode,键盘交互模式android:windowSoftInputMode等,其他的属性用法大家可以参考Android SDK文档学习。另外,< activity >标签还可以包含用于消息过滤的< intent-filter >元素,当然还有可用于存储预定义数据的< meta-data >元素。
<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:hardwareAccelerated=["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 当配置list发生修改时, 是否调用 onConfigurationChanged() 方法 比如 “locale|navigation|orientation”.
这个我用过,主要用来看手机方向改变的. android手机在旋转后,layout会重新布局。
正常情况下. 如果手机旋转了.当前Activity后杀掉,然后根据方向重新加载这个Activity. 就会从onCreate开始重新加载.
如果你设置了 这个选项, 当手机旋转后,当前Activity之后调用onConfigurationChanged() 方法. 而不跑onCreate方法等.android:excludeFromRecents 是否可被显示在最近打开的activity列表里,默认是false
android:finishOnTaskLaunch 当用户重新启动这个任务的时候,是否关闭已打开的activity,默认是false如果这个属性和allowTaskReparenting都是true,这个属性就是王牌。Activity的亲和力将被忽略。该Activity已经被摧毁并非re-parented
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键,如果按下了返回键,则无效
android:multiprocess 是否允许多进程,默认是false
android:noHistory 当用户从Activity上离开并且它在屏幕上不再可见时,Activity是否从Activity stack中清除并结束。默认是false。Activity不会留下历史痕迹
android:screenOrientation activity显示的模式,默认为unspecified:由系统自动判断显示方,landscape横屏模式,宽度比高度大,portrait竖屏模式, 高度比宽度大,user模式,用户当前首选的方,behind模式:和该Activity下面的那个Activity的方向一致(在Activity堆栈中的),sensor模式:有物理的感应器来决定。如果用户旋转设备这屏幕会横竖屏切换,nosensor模式:忽略物理感应器,这样就不会随着用户旋转设备而更改了
android:stateNotNeeded activity被销毁或者成功重启时是否保存状态
android:windowSoftInputMode activity主窗口与软键盘的交互模式,可以用来避免输入法面板遮挡问题,Android1.5后的一个新特性。
这个属性能影响两件事情:
1、当有焦点产生时,软键盘是隐藏还是显示
2、是否减少活动主窗口大小以便腾出空间放软键盘
各值的含义:
(1) stateUnspecified:软键盘的状态并没有指定,系统将选择一个合适的状态或依赖于主题的设置
(2) stateUnchanged:当这个activity出现时,软键盘将一直保持在上一个activity里的状态,无论是隐藏还是显示
(3) stateHidden:用户选择activity时,软键盘总是被隐藏
(4) stateAlwaysHidden:当该Activity主窗口获取焦点时,软键盘也总是被隐藏的
(5) stateVisible:软键盘通常是可见的
(6) stateAlwaysVisible:用户选择activity时,软键盘总是显示的状态
(7) adjustUnspecified:默认设置,通常由系统自行决定是隐藏还是显示
(8) adjustResize:该Activity总是调整屏幕的大小以便留出软键盘的空间
(9) adjustPan:当前窗口的内容将自动移动以便当前焦点从不被键盘覆盖和用户能总是看到输入内容的部分
< activity-alias >
Activity组件别名的声明标签,简单来说就是Activity的快捷方式,属性android:targetActivity表示的就是其相关的Activity名,当然必须是前面已经声明过的Activity。除此之外,其他比较常见的属性有:Activity别名名称android:name,别名开关android:enabled,权限控制android:permission等。另外,我们还需要注意的是,Activity别名也是一个独立的Activity,可以拥有自己的< intent-filter >和< meta-data >元素。
<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" >
... ...
</activity-alias>
< service >属性
Service服务组件的声明标签,用于定义与描述一个具体的Android服务,主要属性有:Service服务类名android:name,服务图标android:icon,服务描述android:label以及服务开关android:enabled等。
<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与activity同级,与activity不同的是,它不能自己启动的,运行在后台的程序,如果我们退出应用时,Service进程并没有结束,它仍然在后台运行。比如听音乐,网络下载数据等,都是由service运行的
- service生命周期:Service只继承了onCreate(),onStart(),onDestroy()三个方法,第一次启动Service时,先后调用了onCreate(),onStart()这两个方法,当停止Service时,则执行onDestroy()方法,如果Service已经启动了,当我们再次启动Service时,不会在执行onCreate()方法,而是直接执行onStart()方法
- service与activity间的通信 : Service后端的数据最终还是要呈现在前端Activity之上的,因为启动Service时,系统会重新开启一个新的进程,这就涉及到不同进程间通信的问题了(AIDL),Activity与service间的通信主要用IBinder负责。具体可参照:https://developer.android.google.cn/guide/components/services
< receiver >属性
Boardcast Receiver广播接收器组件的声明标签,用于定义与描述一个具体的Android广播接收器,其主要属性和< service >标签有些类似:Boardcast Receiver接收器类名android:name,接收器图标android:icon,接收器描述android:label以及接收器开关android:enabled等。
<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" >
... ...
</receiver>
BroadcastReceiver:用于发送广播,broadcast是在应用程序之间传输信息的一种机制,而BroadcastReceiver是对发送出来的 Broadcast进行过滤接受并响应的一类组件。
< provider > 属性
除Activity、Service和Boardcast Receiver之外的另一个“四大组件”,也就是Content Provider内容提供者的声明标签。关于内容提供者组件的概念和用法请参考2.1.4.4节的内容,不再赘述。< provider >标签除了和其他组件相同的android:name、android:icon和android:label等基础属性之外,还提供了用于支持其功能的特殊属性,如:内容提供者标识名称android:authorities,对指定URI授予权限标识android:grantUriPermission以及具体的读、写权限,即android:readPermission和android:writePermission等。
<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" >
... ...
</provider>
contentProvider(数据存储)
- android:authorities:标识这个ContentProvider,调用者可以根据这个标识来找到它
- android:grantUriPermission:对某个URI授予的权限
- android:initOrder
< uses-library >属性
用户库,可自定义。所有android的包都可以引用。
参考资料:
Android开发指南
疯狂Android讲义 第3版
AndroidManifest.xml配置文件详解
Android的AndroidManifest.xml配置文件