Android学习笔记之l⽂件解析(详
解)
⼀、关于l
程序中必须的⽂件。它位于整个项⽬的根⽬录,描述了package中暴露的组件(activities, services, 等等),他们各⾃的实现类,各种能被处理的数据和启动位置。除了能声明程序中的Activities, ContentProviders, Services, 和Intent Receivers,还能指定permissions和instrumentation(安全控制和测试)
⼆、l结构
<?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>):(属性)
A、xmlns:android
B、package
指定本应⽤内java主程序包的包名,它也是⼀个应⽤进程的默认名称
xml文件怎么打开C、sharedUserId
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>):属性
⼀个l中必须含有⼀个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来开发应⽤程序,可在l中将此属性设置为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。
3、第三层(<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>
(注:有些在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
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