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"] >
注:有些在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有四种加载模式:
(1) standard:就是intent将发送给新的实例,所以每次跳转都会生成新的activity,默认为standard
(2)singleTop:也是发送新的实例,但不同standard的一点是,在请求的Activity正好位于栈顶时(配置成singleTop的Activity),不会构造新的实例
(3)singleTask:和后面的singleInstance都只创建一个实例,当intent到来,需要创建设置为singleTask的Activity的时候,系统会检查栈里面是否已经有该Activity的实例。如果有直接将intent发送给它
(4)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
activity被销毁或者成功重启时是否保存状态
<11> 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:当前窗口的内容将自动移动以便当前焦点从不被键盘覆盖和用户能总是看到输入内容的部分
<12> android:exported
用于指示该服务是否能够被其他应用程序组件调用或跟它交互。如果设置为true,则能够被调用或交互,否则不能。设置为false时,只有同一个应用程序的组件或带有相同用户ID的应用程序才能启动或绑定该服务。
它的默认值依赖与该服务所包含的过滤器。没有过滤器则意味着该服务只能通过指定明确的类名来调用,这样就是说该服务只能在应用程序的内部使用(因为其他外部使用者不会知道该服务的类名),因此这种情况下,这个属性的默认值是false。另一方面,如果至少包含了一个过滤器,则意味着该服务可以给外部的其他应用提供服务,因此默认值是true。
这个属性不是限制把服务暴露给其他应用程序的唯一方法。还可以使用权限来限制能够跟该服务交互的外部实体
4> 第四层()
结构图:
android:icon="drawable resource"
android:label="string resource"
android:priority="integer" >
<1> intent-filter属性
(1)android:priority(解释:有序广播主要是按照声明的优先级别,如A的级别高于B,那么,广播先传给A,再传给B。优先级别就是用设置priority属性来确定,范围是从-1000~1000,数越大优先级别越高)
Intent filter内会设定的资料包括action , data 与 category三种,也就是说filter只会与intent里的这三种资料作对比动作
(2)action属性
action很简单,只有android:name这个属性。常见的android:name值为android.intent.action.MAIN,表明此activity是作为应用程序的入口,有关android:name具体有很系统提供的值
(3)category属性
category也只有android:name属性。常见的android:name值为android.intent.category.LAUNCHER(决定应用程序是否显示在程序列表里)
有关android:name具体有很系统提供的值
1> CATEGORY_ALTERNATIVE:设置这个activity是否可以被认为是用户正在浏览的数据的一个可选择的action
2> CATEGORY_APP_BROWSER:和ACTION_MAIN一起使用,用来启动浏览器应用程序
3> CATEGORY_APP_CALCULATOR:和ACTION_MAIN一起使用,用来启动计算器应用程序
4> CATEGORY_APP_CALENDAR:和ACTION_MAIN一起使用,用来启动日历应用程序
5> CATEGORY_APP_CONTACTS: 和ACTION_MAIN一起使用,用来启动联系人应用程序
6> CATEGORY_APP_EMAIL:和ACTION_MAIN一起使用,用来启动邮件应用程序
7> CATEGORY_APP_GALLERY:和ACTION_MAIN一起使用,用来启动图库应用程序
8> CATEGORY_APP_MAPS:和ACTION_MAIN一起使用,用来启动地图应用程序
9> CATEGORY_APP_MARKET: 这个activity允许用户浏览和下载新的应用程序
10> CATEGORY_APP_MESSAGING: 和ACTION_MAIN一起使用,用来启动短信应用程序
11> CATEGORY_APP_MUSIC:和ACTION_MAIN一起使用,用来启动音乐应用程序
12> CATEGORY_BROWSABLE:能够被浏览器安全调用的activity必须支持这个category
13> CATEGORY_DEFAULT:设置这个activity对于默认的action是否是一个可选的
14> CATEGORY_EMBED:可以运行在父activity容器内
15> CATEGORY_HOME:主activity,当应用程序启动时,它是第一个显示的activity
16> CATEGORY_LAUNCHER:应该在上层的启动列表里显示
17> CATEGORY_MONKEY:这个activity可能被monkey或者其他的自动测试工具执行
18> CATEGORY_OPENABLE:用来指示一个GET_CONTENT意图只希望ContentResolver.openInputStream能够打开URI
19> CATEGORY_PREFERENCE:这个activity是一个选项卡
20> CATEGORY_SAMPLE_CODE:作为一个简单的代码示例使用(一般情况下不使用)
21> CATEGORY_SELECTED_ALTERNATIVE:设置这个activity是否可以被认为是用户当前选择的数据的一个可选择的action
22> CATEGORY_TAB:想要在已有的TabActivity内部作为一个Tab使用
23> CATEGORY_TEST:供测试使用(一般情况不使用)
24> CATEGORY_UNIT_TEST:联合测试使用
(4)
data属性
android:mimeType="string"
android:path="string"
android:pathPattern="string"
android:pathPrefix="string"
android:port="string"
android:scheme="string"/>
每个 元素指定一个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也必须要指定
1) mimeType(指定数据类型),若mimeType为'Image',则会从content Provider的指定地址中获取image类型的数据。还有'video'啥的,若设置为video/mp4,则表示在指定地址中获取mp4格式的video文件
2) pathPattern和PathPrefix主要是为了格式化path所使用的
5> 第五层
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])
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">
其中android.targetActivity是指向对应快捷方式的activity,如上述的shortcut(此Activity名)。
android:label是指快捷方式的名称,而快捷方式的图标默认是给定的application图标
7> 第三层
<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负责后台的需要长期运行的任务,Activity与service间的通信主要用IBinder负责
<4>
android:exported[="true" | "false"]
android:icon="drawable resource"
android:label="string resource"
android:name="string"
android:permission="string"
android:process="string">
service标签内的属性之前已有描述
8> 第三层
receiver的属性与service一样
BroadcastReceiver:用于发送广播,broadcast是在应用程序之间传输信息的一种机制,而BroadcastReceiver是对发送出来的 Broadcast进行过滤接受并响应的一类组件
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">
contentProvider(数据存储)
(1)android:authorities:标识这个ContentProvider,调用者可以根据这个标识来找到它
(2)android:grantUriPermission:对某个URI授予的权限
(3)android:initOrder
10> 第三层
用户库,可自定义。所有android的包都可以引用
11> 第一层
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"/>
这是在android1.6以后的新特性,支持多屏幕机制各属性含义:这四个属性,是否支持大屏,是否支持中屏,是否支持小屏,是否支持多种不同密度。这个元素用于指定应用程序所支持的屏幕尺寸,并针对比应用程序所支持的屏幕还要大屏幕,启用屏幕兼容模式。在应用程序中使用这个元素指定应用程序所支持的屏幕尺寸是至关重要的。如果应用程序调整尺寸属性来填充整个屏幕,那么应用程序就要支持这个给定的尺寸。通常对于大多数应用程序,系统可以很好的完成这种调整工作,并且为了让应用程序在比一个手持设备大的屏幕上工作,你不需要做任何额外的工作。但是,针对不同的屏幕尺寸,通过提供可选的布局资源来优化应用程序的UI经常是很重要的。例如,一个运行在手持设备上的Activity布局,如果想要运行在平板电脑上,就需要修改这个Activity的布局。但是,如果为了适应不同的屏幕尺寸而调整了尺寸,但应用程序也不能很好的工作,就可以使用元素的属性来控制应用程序是否应该发布给屏幕较小的设备,或者使用系统的屏幕兼容模式,让UI放大以适应较大屏幕的要求。在没有针对较大屏幕尺寸的设计,并且普通的尺寸不能达到合适结果时,屏幕的兼容模式会通过模拟普通尺寸的屏幕和中等密度来缩放UI,以便它能够填充整个屏幕,这样会导致UI模糊,因此针对大屏幕的优化是比较好的
12> 第二层与性能都差不多
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"] />
android:glEsVersion="integer"
android:name="string"
android:required=["true" | "false"] />
这两者都是在描述应用所需要的硬件和软件特性,以便防止应用在没有这些特性的设备上安装
13> 第二层
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> 第二层
android:handleProfiling=["true" | "false"]
android:icon="drawable resource"
android:label="string resource"
android:name="string"
android:targetPackage="string"/>
定义一些用于探测和分析应用性能等等相关的类,可以监控程序。在各个应用程序的组件之前instrumentation类被实例化
android:functionalTest(解释:instrumentation类是否能运行一个功能测试,默认为false)
15>
、、、区别最常用的当属,当需要获取某个权限的时候就必须在我们的manifest文件中声明,此与同级,具体权限列表请看此处通常情况下我们不需要为自己的应用程序声明某个权限,除非你提供了供其他应用程序调用的代码或者数据。这个时候你才需要使用 这个标签。很显然这个标签可以让我们声明自己的权限。比如:
那么在activity中就可以声明该自定义权限了,如:
android:permission="com.teleca.project.MY_SECURITY">
当然自己声明的permission也不能随意的使用,还是需要使用来声明你需要该权限
就是声明一个标签,该标签代表了一组permissions,而是为一组permissions声明了一个namespace