android基础知识13:l⽂件解析
1、重要性
伦琴射线管
因此,该⽂件提供了Android系统所需要的关于该应⽤程序的必要信息,即在该应⽤程序的任何代码运⾏之前系统所必须拥有的信息。⼀个典型的Android应⽤程序的结构如下图所⽰:
2、主要功能
它指定了该应⽤程序的Java包:该包名作为应⽤程序的⼀个独特标识。
它描述了应⽤程序组件:该应⽤程序由哪些activity,rvice,broadcast receiver和content provider组成。它指定了实现每个组件的类以及公开发布它们的能⼒(例如,它们能持有哪个Intent信息)。这些声明使Android系统知道这⼉有什么组件以及在什么条件下它们可以被载⼊。
它决定那些进程将容纳应⽤程序组件。
它声明了本应⽤程序必须拥有哪些许可,以便访问API的被保护部分,以及与其他应⽤程序交互。
它也声明了其他应⽤程序在和该应⽤程序交互时需要持有的许可。
它列出了Instrumentation类,可以在应⽤程序运⾏时提供简档和其他信息。这些声明仅当应⽤程序在开发和测试过程中被提供;它们将在应⽤程序正式发布之前被移除。
它声明了该应⽤程序所需的Android API的最⼩化⽔平。
它列出了该应⽤程序必须链接的库。
3、主要结构及规则
下⾯列表显⽰了manifest⽂件的通常的结构以及它可以含有的元素。每个元素,连同它的所有属性,会在各个单独的⽂档⾥进⾏充分的描绘。
下⾯是按照字母顺序排列的所有可以出现在manifest⽂件⾥的元素。它们是唯⼀合法的元素;你不能加⼊你⾃⼰的元素或属性。
说明:l⽂件的结构、元素,以及元素的属性,可以在Android SDK⽂档中查看详细说明。⽽在看这些众多的元素以及元素的属性前,需要先了解⼀下这些元素在命名、结构等⽅⾯的规则:
元素:在所有的元素中只有<manifest>和<application>是必需的,且只能出现⼀次。如果⼀个元素包含有其他⼦元素,必须通过⼦元素的属性来设置其值。处于同⼀层次的元素,这些元素的说明是没有顺序的。
属性:按照常理,所有的属性都是可选的,但是有些属性是必须设置的。那些真正可选的属性,即使不存在,其也有默认的数值项说明。除了根元素
<manifest>的属性,所有其他元素属性的名字都是以android:前缀的;
caption是什么意思定义类名:所有的元素名都对应其在SDK中的类名,如果你⾃⼰定义类名,必须包含类的数据包名,如果类与application处于同⼀数据包中,可以直接简写为“.”;
多数值项:如果某个元素有超过⼀个数值,这个元素必须通过重复的⽅式来说明其某个属性具有多个数值项,且不能将多个数值项⼀次性说明在⼀个属性中;
资源项说明:当需要引⽤某个资源时,其采⽤如下格式:@[ package :] type : name 。例如 <activity android:icon=”@drawable/icon ” . . . > 字符串值:类似于其他语⾔,如果字符中包含有字符“\”,则必须使⽤转义字符“\\”;
4、详细说明
值得⼀提⼀些常⽤之处:
1、⼏乎所有的l(以及许多其他Android的xml的⽂件)在第⼀个元素中包含了命名空间的声明
xmlns:android="/apk/res/android"。这样使得Android中各种标准属性能在⽂件中使⽤,提供了⼤部分元素中的数据。
2、⼤部分manifests包含了单个<application>的元素,它定义了所有的application级别组件和属性,并能在package中使⽤。
protect3、任何被⽤户看作顶层应⽤程序,并能被程序启动器所⽤的package,需要包含⾄少⼀个Activity组件来⽀持MAIN操作和LAUNCHER种类。动作android.intent.action.MAIN指⽰这是应⽤程序的⼊⼝点。类别 android.intent.category.LAUNCHER将此Activity放在启动器窗⼝中。
在最外层的<manifest>中包含了包名如 package="cn.androidlover.demo" 、软件的版本号 android:versionCode="1" 以及 android:versionName="1.0"的属性,⽽⾥⾯⼀层的<application>分⽀中将可能包含Android程序的四种对象 Activity、Service、Content Provider以及Receiver。我们每添加上⾯四个类型中的任⼀种新对象都需要在l⽂件中添加相应节点,否则运⾏时将
会产⽣异常。每⼀个activity必须要⼀个<activity>标记对应,⽆论它给外部使⽤或是只⽤于⾃⼰的package 中。如果⼀个activity没有对应的标记,你将不能运⾏它。
此⽂件⼀个重要的地⽅就是它所包含的intent-filters。这些filters描述了activity启动的位置和时间。每当⼀个 activity(或者操作系统)要执⾏⼀个操作,例如:打开⽹页或联系簿时,它创建出⼀个intent的对象。它能承载⼀些信息描述了你想做什么,你想处理什么数据,数据的类型,和⼀些其他信息。Android⽐较了intent对象中和每个application所暴露的intent-filter中的信息,来找到最合适的activity来处理调⽤者所指定的数据和操作。关于intent的更多信息请访问Intent参考页⾯。
4.1 Manifest属性介绍
A、xmlns:android
定义android命名空间,⼀般为/apk/res/android,这样使得Android中各种
标准属性能在⽂件中使⽤,提供了⼤部分元素中的数据。
B、package
指定本应⽤内java主程序包的包名,它也是⼀个应⽤进程的默认名称
C、sharedUrId
表明数据权限,因为默认情况下,Android给每个APK分配⼀个唯⼀的UrID,所以是默认禁⽌不同APK访问共享数据的。若要共享数据,第⼀可以采⽤Share Preference⽅法,第⼆种就可以采⽤sharedUrId了,将不同APK的sharedUrId都设为⼀样,则这些APK之间就可以互相共享数据了。详见:wallage./blog/static/17389624201011010539408/
D、sharedUrLabel
⼀个共享的⽤户名,它只有在设置了sharedUrId属性的前提下才会有意义
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,系统将会根据存储空间⾃⼰去适应
imust选择internalOnly是指必须安装到内部才能运⾏
(注:需要进⾏后台类监控的APP最好安装在内部,⽽⼀些较⼤的游戏APP最好安装在SD卡上。现默认为安装在内部,如果把APP安装在SD卡上,⾸先得设置你的level为8,并且要配置android:installLocation这个参数的属性为preferExternal)
4.2 application属性介绍
有关l⽂件的application分⽀我们有必要了解⼀些常见的属性,这⾥可以看到⼀些我们实⽤的选项,⽐如允许调试
android:debuggable、任务关系android:taskAffinity,⽐如我们常见的⽅式创建⼀个新的任务实⽤标记 FLAG_ACTIVITY_NEW_TASK,为程序制定⼀个主题,可以使⽤android:theme指向⼀个主题⽂件。平时我们创建的程序使⽤⼀些安全敏感项,会需要请求系统许可权限,这⾥可以使⽤android:permission来制定相关的许可,每个程序的rvice、 activity、content provider、receiver都需要在application的节点内实现。有关完整的属性可以查看:
A、android:allowClearUrData('true' or 'fal')
⽤户是否能选择⾃⾏清除数据,默认为true,程序管理器包含⼀个选择允许⽤户清除数据。当为true时,⽤户可⾃⼰清理⽤户数据,反之亦然B、android:allowTaskReparenting('true' or 'fal')
是否允许activity更换从属的任务,⽐如从短信息任务切换到浏览器任务
C、android:backupAgent
国际音标表这也是Android2.2中的⼀个新特性,设置该APP的备份,属性值应该是⼀个完整的类名,如com.project.TestCa,此属性并没有默认值,并且类名必须得指定(就是个备份⼯具,将数据备份到云端的操作)
D、android:debuggable
这个从字⾯上就可以看出是什么作⽤的,当设置为true时,表明该APP在⼿机上可以被调试。默认为fal,在fal的情况下调试该APP,就会报以下错误:
Device XXX requires that applications explicitely declare themlves as debuggable in their manifest.
Application XXX does not have the attribute 'debuggable' t 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。如果为fal,它覆盖组件指定的值;所有组件都是disabled。
G、android:hasCode('true' or 'fal')
星期一的英文表⽰此APP是否包含任何的代码,默认为true,若为fal,则系统在运⾏组件时,不会去尝试加载任何的APP代码
burstout
⼀个应⽤程序⾃⾝不会含有任何的代码,除⾮内置组件类,⽐如Activity类,此类使⽤了AliasActivity类,当然这是个罕见的现象
(在Android2.3可以⽤标准C来开发应⽤程序,可在l中将此属性设置为fal,因为这个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
该应⽤程序是否应该在任何时候都保持运⾏状态,默认为fal。因为应⽤程序通常不应该设置本标识,持续模式仅仅应该设置给某些系统应⽤程
序才是有意义的。
N、android:process
应⽤程序运⾏的进程名,它的默认值为<manifest>元素⾥设置的包名,当然每个组件都可以通过设置该属性来覆盖默认值。如果你想两个应⽤程
序共⽤⼀个进程的话,你可以设置他们的android:process相同,但前提条件是他们共享⼀个⽤户ID及被赋予了相同证书的时候
O、android:restoreAnyVersion
formulae同样也是android2.2的⼀个新特性,⽤来表明应⽤是否准备尝试恢复所有的备份,甚⾄该备份是⽐当前设备上更要新的版本,默认是fal
P、android:taskAffinity
拥有相同的affinity的Activity理论上属于相同的Task,应⽤程序默认的affinity的名字是<manifest>元素中设定的package名
Q、android:theme
是⼀个资源的风格,它定义了⼀个默认的主题风格给所有的activity,当然也可以在⾃⼰的theme⾥⾯去设置它,有点类似style。
4.3 Activity属性介绍
exists
另外:Activity的属性常⽤的可能为android:name和android:label两个,但我们需要了解所有的属性以帮助解决复杂的问题,完整的如下:
[one or more of: "stateUnspecified" "stateUnchanged" "stateHidden" "stateAlwaysHidden" "stateVisible" "stateAlwaysVisible" "adjustUnsp
(注:有些在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列表⾥,默认是fal
5、android:finishOnTaskLaunch
当⽤户重新启动这个任务的时候,是否关闭已打开的activity,默认是fal
如果这个属性和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),不会构造新