<activity>是最常用也是最重要的标签, 用于声明一个activity.
语法:
<activity android:allowEmbedded=["true" | "false"] android:allowTaskReparenting=["true" | "false"] android:alwaysRetainTaskState=["true" | "false"] android:autoRemoveFromRecents=["true" | "false"] android:banner="drawable resource" android:clearTaskOnLaunch=["true" | "false"] android:configChanges=["mcc", "mnc", "locale", "touchscreen", "keyboard", "keyboardHidden", "navigation", "screenLayout", "fontScale", "uiMode", "orientation", "screenSize", "smallestScreenSize"] android:documentLaunchMode=["intoExisting" | "always" | "none" | "never"] 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:maxRecents="integer" android:multiprocess=["true" | "false"] android:name="string" android:noHistory=["true" | "false"] android:parentActivityName="string" android:permission="string" android:process="string" android:relinquishTaskIdentity=["true" | "false"] android:screenOrientation=["unspecified" | "behind" | "landscape" | "portrait" | "reverseLandscape" | "reversePortrait" | "sensorLandscape" | "sensorPortrait" | "userLandscape" | "userPortrait" | "sensor" | "fullSensor" | "nosensor" | "user" | "fullUser" | "locked"] android:stateNotNeeded=["true" | "false"] android:taskAffinity="string" android:theme="resource or theme" android:uiOptions=["none" | "splitActionBarWhenNarrow"] android:windowSoftInputMode=["stateUnspecified", "stateUnchanged", "stateHidden", "stateAlwaysHidden", "stateVisible", "stateAlwaysVisible", "adjustUnspecified", "adjustResize", "adjustPan"] > . . . </activity>
父标签:
<application>
子标签:
<intent-filter>,
<meta-data>
描述:
声明一个Activity(通常是其子类), 所有的Activity都必须在Manifest中声明, 这样Android才能看到该Activity, 不声明的Activity将永远无法被调用.
属性:
android:allowEmbedded: 表明该Activity可以作为子Activity嵌入另一Activity.默认值为false. 在可穿戴设备上该值会更经常用到.
android:allowTaskReparenting: 指定该Activity是否可以从启动它的Task移动到另一个. 如果不设置, 那么它将被设置为<application>的allowTaskReparenting的值. 默认为false.
android:autoRemoveFromRecents: 如果为true表示Task会从overview screen自动删除.
android:banner: 在Android TV中提供一个banner, 需要drawable资源, 无默认值.
android:clearTaskOnLaunch: 指定每次点击桌面图标启动一个activity的时候, 它是否清除Task. 默认值为false, 当这个值设置为true的时候, 每次点开启动图标都会回到root activity. 比如, 我们的APP每次启动都会启动一个startActivity, 然后我们点击它进入了一个Activity-A, 这时候点击home键回到桌面, 如果为设置该属性, 那么重新启动该应用的时候, 应该回到Activity-A, 如果设置为true, 那么我们会进入startActivity.
android:configChanges: 指定一个配置项的列表, 当该表中的配置项发生改变的时候, activity自己处理它, 不许要Android重启activity. 默认情况下配置项改变的时候activity会被重启, 配置了该属性之后, 则会用onConfigurationChanged()方法代替重启. 下表中的值为该属性的可用值,可以选择多项, 用”|”连接, 比如” locale|navigation|orientation":
值 |
说明 |
“mcc” |
国际用户移动识别码(IMSI)移动国家代码改变, 其实就是检测到了新的SIM卡并更新了MCC. |
“mnc” |
国际用户移动识别码(IMSI)移动网络代码改变, 同上也是检测到了SIM卡改变并更新了MNC. |
“locale” |
语言环境改变, 用户通过设置改变了系统语言. |
“touchscreen” |
触屏发生了变化(这个应该永远都不会被触发). |
“keyboard” |
键盘类型改变, 比如用户接入了一个外部键盘. |
“keyboardHidden” |
键盘辅助改变, 比如用户接入了一个硬件键盘. |
“navigation” |
导航类型发生变化(轨迹球或者dpad), 通常不会发生. |
“screenLayout” |
屏幕布局发生改变.可能由于一个不同的显示屏被激活. |
“fontScale” |
字体缩放参数改变, 通常由于用户选择了一个新的全局字体大小. |
“uiMode” |
UI模式改变, 通常由于用户将设备接入桌面/汽车插槽, 或者夜晚模式开启. |
“orientation” |
屏幕方向改变. |
“screenSize” |
当前可用屏幕尺寸改变. 在屏幕方向发生变化的时候, 该配置将会变化. |
“smallscreenSize” |
屏幕物理尺寸发生变化, 通常是用户换了一个屏幕. |
“layoutDirection” |
布局方向发生变化, 比如left-to-right (LTR) 改为 right-to-left (RTL) |
所有上述的配置发生变化都会影响APP在屏幕上的显示. 当配置发生改变时, onConfigurationChanged()将会被调用.
android:documentLaunchMode: 指定每次启动的时候activity的实例如何添加到任务中. 当用户使用APP打开一个文档的时候,activity的行为会受到该属性的影响, 它可以取以下值:
值 |
说明 |
“intoExisting” |
activity重用已经存在的任务打开文档. 使用这个设置相当于设置了”FLAG_ACTIVITY_NEW_DOCUMENT”标志, 而不设置”FLAG_ACTIVITY_MULTIPLE_TASK” 标志. |
“always” |
activity为文档创建一个新的任务, 就算文档已经被打开, 依然会重新创建一个任务. 相当于设置了”FLAG_ACTIVITY_NEW_DOCUMENT”和”FLAG_ACTIVITY_MULTIPLE_TASK”标志. |
“none” |
activity不会为文档新建任务, 该值为默认值, 当设置了”FLAG_ACTIVITY_NEW_DOCUMENT”标记时候才会新建. |
“never” |
即便设置了”FLAG_ACTIVITY_NEW_DOCUMENT”标志也不会创建新的任务. 该值会覆盖”FLAG_ACTIVITY_NEW_DOCUMENT”和”FALG_ACTIVITY_MULTIPLE_TASK”标志, 使已设置的这两个标志不再生效. |
none和never必须和launchMode=”standard”一起使用, 如果没设置, none为默认值.
android:enabled: 指定activity是否可以被实例化,true表示可以, false不可以, 默认值为false. <application>也自带enabled属性, 必须两者都为true才可以实例化.
android:excludeFromRecents: 指定了被该activity启动的task是否保存在历史记录中. 如果该activity是task的rootactivity, 那么当该属性为true的时候, 它将不会在历史任务中出现. 默认值为false.
android:exported: 指定activity是否可以被其它APP启动. true表示可以, false表示不可以. 如果为false, 则意味着该activity只能由APP内部或者跟APP相同的userID的APP启动. 默认值由activity是否包含<intent-filter>决定, 如果有<intent-filter>则表示可以由外部APP启动, 那么默认值为true, 如果不包含<intent-filter>那么默认值为true. 该属性并非唯一可以决定activity是否可以被外部APP启动的属性,<permission>对此也有限制.
android:finishOnTaskLaunch:表示该activity的实例每次重新启动它的Task的时候是否应该关闭(finished). true表示应关闭, false表示不应该关闭, 默认值是false. 如果该属性与allowTaskReparenting都被设置为true, 那么该属性会胜过其它属性. activity的affinity会被忽略, 该activity不会被重置根目录, 而是会被销毁.
android:hardwareAccelerated: 该activity是否使用硬件加速渲染,true表示使用, false表示不适用, 默认值为false. 从Android3.0开始硬件加速OpenGL渲染开始应用于Android的APP, 以改善普通2D操作的性能. 当硬件加速开启的时候, 大部分在Canvas, Paint, Xfermode, ColorFilter, Shader和Camera中的操作会被加速. 它会使滑动和动画更加流畅并且提升整体的流畅性, 即便我们并没有明确的使用framework的OpenGL库. 启用硬件加速将会消耗更多的内存. 并非所有的OpenGL 2D操作都会被加速, 所以也不要盲目使用这个属性, 使用的时候应该确保它可以生效并且没有错误.
android:icon: 用于指定activity的图标. 当Android需要展示一个activity的图标的时候, 就用到它了, 通常会跟label在一起描述一个activity.该属性必须指向一个图片资源, 如果不设置的话, Android会使用<application>的icon. 不论是单独设置还是使用<application>的icon, 它都会作为该<intent-filter>的icon.
android:label: 为activity指定一个用户可读的标签. 跟android:icon属性一样, 如果不设置该属性, 那么Android会使用<application>的label属性用于该activity.同样的, 无论是单独设置还是使用<application>的label, 它都会作为所有<intent-filter>的默认标签. android:label应该被设置为字符串资源或者raw资源.
android:launchMode: 指定activity的启动模式. 启动activity的时候, Intent使用flag参数可以设置四种不同的启动模式, 分别是”standard”, “singleTop”, “singleTask”和”singleInstance”.
这四种模式可以分为两组来分析, “standard”和”singleTop”为一组, 这组的特点是可以重复多次启动同一个activity类的实例. 并且这些实例可以位于任何Task里面的任何位置, 区别在于如果”singleTop”的activity实例位于栈顶, 那么它将不会重新创建而是在onNewIntent()方法中收到一个新的intent对象.
“singleTask”和”singleInstance”是一组, 这组跟前一组相反, 它们只能用来启动一个Task,它们永远都是Task的root activity(“singleTask”需要指定affinity属性), 此外设备只能拥有一个它们的实例. 它们的区别在于”singleTask”所在的Task可以容纳”standard”和”singleTop”的实例, 但是”singleInstance”所在的Task是它独占的, 不能包含其它的activity实例.
使用场景 |
启动模式 |
多实例? |
描述 |
大多数Activities的启动模式 |
“standard” |
是 |
默认值, Android总是会创建一个新的activity并且传给它intent |
使用该模式可以避免重复启动不必要的activity. |
“singleTop” |
可以, 但是是有条件的 |
如果singleTop类型的activity已经在栈顶, 那么再次创建该实例不会新建activity, 但是会调用onNewIntent()方法并传入新的intent对象. |
特别用途, 一般不推荐使用. |
“singleTask” |
不支持 |
全局只会有一个实例, 已存在时候创建新的实例会将其移至栈顶, 并且清除掉其上面的activity, 并调用onNewIntent()方法传入新的intent. |
同样不推荐使用. |
“singleInstance” |
不支持 |
跟”singleTask”类似, 但是它必须独占一个任务. |
android:maxRecents: 最大任务数. 当任务数达到设定的数字的时候, Android会移除最近访问的activity. 可以设置为1-50, 必须是整数, 默认为16.
android:multiprocess: 指定该activity的实例是否可以被加入到启动它的组件的进程中(不是同一个进程). true表示可以, false表示不可以, 默认值为false. 通常情况下, 一个activity应该被加入到定义它的APP进程中, 所以activity的所有实例理论上应该运行在同一进程中. 但是当这个属性被设置为true的时候, 就意味着该activity的实例们可以运行在不同的进程中, 允许系统在任何地方创建activity的实例.
android:name: activity的类的名字. 应该为Activity类的子类. 没有默认值, 必须指定. 可以包含完整的类名, 比如”com.example.project.ExtracurricularActivity”, 也可以使用简单的名字, 可以省略前面的包名”.ExtracurricularActivity”, 此时activity的包名需要跟<manifest>中指定的package属性一样. 一旦发布了你的APP, 就不应该再修改这个值, 除非activity设置为android:exported=”false”.
android:noHistory: 当用户离开该activity的时候, 该activity是否应该被从activity堆栈中移除并且finished.true表示移除, false表示不移除. 默认值为false. 为true的意思是activity将不会留下历史痕迹, 不会保留在堆栈中, 用户离开了就回不来了. 所以该activity的onActivityResult()方法永远不会被调用.
android:parentActivityName: activity的逻辑父activity的名字(类名). 该name必须跟某个activity的android:name一致. Android通过该属性决定当一个activity的action bar上的返回键被按下的时候, 它应该返回到哪个activity.Android可以通过这个属性和TaskStackBuilder来构建一个back stack.
为了支持API4-16, 我们也可以使用<meta-data>标签的"android.support.PARENT_ACTIVITY"来指定一个父activity.比如:
<activity android:name="com.example.app.ChildActivity" android:label="@string/title_child_activity" android:parentActivityName="com.example.myfirstapp.MainActivity" > <!-- Parent activity meta-data to support API level 4+ --> <meta-data android:name="android.support.PARENT_ACTIVITY" android:value="com.example.app.MainActivity" /> </activity>
android:permission: 启动该activity需要申请的权限名. 如果想要启动该activity的组件没有申请该权限, 那么它就无法启动该activity.如果该属性未设置, 那么它将会直接被设置为<application>的permission属性. 如果application和activity都没有设置该属性, 那么就意味着该activity没有被任何的permission保护.
android:process: 指定activity应该运行的进程名称. 通常情况下, 所有的组件都运行在APP默认创建的进程中, 我们不需要指定这个值. 如果有需要的话我们可以指定该activity运行在一个指定的进程中. 如果进程的名称以”:”开头, 就意味着这是一个APP内部的私有进程. 如果进程名称以一个小写字母开头, 那么意味着这个进程是一个全局进程, 这样可以允许不同的APP组件都可以访问这个进程, 可以减少资源共享的开销. <application>的process属性可以为所有属性设置一个默认的进程名称.
android:relinquishTaskIdentity:默认值为false,实在没看懂.
android:screenOrientation: 指定activity在显示器上的显示方向. 该属性可以取以下值:
unspecified: 这个是默认值, 意思是由系统选择方向. 不同设备可能有不同的表现.
behind: 意识是activity的方向跟backstack中的前一个activity相同.
landscape: 横屏方向(显示屏的宽度大于高度).
portrait: 纵向方向(显示屏的高度大于宽度).
reverseLandscape: 跟普通的横屏相反的方向.
reversePortrait: 跟普通的纵屏相反的方向.
sensorLandscape: 传感器横屏, 根据传感器方向决定向哪个方向横屏.
sensorPortrait: 传感器纵屏, 根据传感器方向决定向哪个方向纵屏.
userLandscape: 如果用户关闭了传感器, 那么它等同于landscape,如果用户打开传感器, 那么它等同于sensorLandscape.
userPortrait: 如果用户关闭了传感器, 那么它等同于portrait,如果用户打开传感器, 那么它等同于sensorPortrait.
sensor: 由传感器决定方向. 当用户旋转屏幕的时候会跟着转. 但是个别设备可能不会支持全部的四个方向.
fullSensor: 跟sensor类似, 但是可以支持全部的四个方向,有些设备可能不支持reverseLandscape和reversePortrait, 但是通过设置该属性就可以支持了.
nosensor: 忽略传感器, 系统选择策略跟unspecified相同.
user: 用户当前优选的方向.
fullUser: 如果用户锁定了传感器, 那么fullUser和user表现相同, 否则就跟fullSensor相同.
locked: 锁定为当前的方向, 不管是啥.
android:stateNotNeeded: 指定activity是否可以在没有保存自己状态的情况下被重新创建或者杀死. true表示可以, false表示不可以, 默认为false. 通常在一个activity被临时回收的时候, 它的onSaveInstanceState()将会被调用. 该方法会将activity的当前状态保存在一个Bundle对象中, 然后在activity被重新创建的时候传给onCreate()方法. 如果这个值设置为true, 那么onSaveInstanceState()方法可能不会被调用, onCreate()方法则会收到一个null参数. 就好像activity第一次被创建. 例如APP的MainActivity使用该属性可以确保在activity由于某些原因崩溃的时候不被删除.
android:taskAffinity: 相当于activity所持有的task的名字. 具有相同affinity的activity属于同一个task.task的affinity取决于root activity的affinity. 如果root activity未指定affinity, 那么会使用<application>的affinity, 如果application也未指定, 那么task的名字跟包名一样.
android:theme: 为activity指定一个主题资源. 如果未设置, 则使用<application>的theme, 如果<application>也为设置, 则使用系统默认主题.
android:uiOptions: 为activityUI设置额外的选项. 必须使用以下值之一:
none: 没有额外选项, 此为默认.
splitActionBarWhenNarrow:为activity在屏幕下方添加一个动作栏.
android:windowSoftInputMode: 指定activity的主窗口如何与软键盘交互.该属性的设置会影响以下两件事:
当activity成为用户焦点的时候软键盘的状态.
activity的主窗口该如何调整自己以适应软键盘. 可能是窗口调整尺寸以腾出空间给软键盘或者窗口移动以让软键盘不挡住输入焦点.
取值必须为下面表格中的一种, 或者”state…”值加上一个”adjust…”的值. 中间通过”|”连接, 比如:
<activity android:windowSoftInputMode="stateVisible|adjustResize" . . . >
值 |
描述 |
stateUnspecified |
软键盘状态未指定. 该值为默认值. 系统将会自己采取合适的策略或者依赖于主题中的设置来管理软键盘. |
stateUnchanged |
当activity获得焦点时, 软键盘保持它上次出现时的状态. |
stateHidden |
当用户选中该activity的时候, 软键盘隐藏. 意思是用户开启一个activity, 而不是通过返回键回到这个activity. |
stateAlwaysHidden |
当activity的主窗口获得输入焦点的时候, 软键盘总是隐藏的. |
stateVisible |
当用户正常打开activity的时候, 显示软键盘. |
stateAlwaysVisible |
开启一个activity的时候总是显示软键盘, 通过返回键返回到activity不算. |
adjustUnspecified |
不指定activity如何为软键盘腾出空间, 系统会根据具体情况来决定选择adjustResize或者adjustPan方式. 当调整尺寸可以让所有的内容都可见的时候, 那么就选择adjustResize. |
adjustResize |
activity的主窗口总是通过调整尺寸来为软键盘腾出空间. |
adjustPan |
activity的主窗口不会通过调整尺寸来为软键盘腾出空间, 而是通过平移窗口来使输入焦点不会被软键盘挡住, 官方认为这种方法通常不如调整尺寸来的效果好, 因为输入的时候用户就看不见被软键盘挡住的部分了. |
总结:
activity行为7:
android:launchMode
android:multiprocess
android:noHistory
android:parentActivityName
android:permission
android:process
android:stateNotNeeded
activity本身属性7:
android:hardwareAccelerated
android:enabled
android:exported
android:icon
android:label
android:name
android:theme
task相关9:
android:allowTaskReparenting
android:alwaysRetainTaskState
android:autoRemoveFromRecents
android:clearTaskOnLaunch
android:excludeFromRecents
android:finishOnTaskLaunch
android:maxRecents
android:relinquishTaskIdentity
android:taskAffinity
非移动设备常用2:
android:allowEmbedded
android:banner
配置相关3:
android:configChanges
android:screenOrientation
android:windowSoftInputMode
未分类2:
android:documentLaunchMode
android:uiOptions
目前来看"配置相关"和"本身属性"较常用到, 其它则不常用到.