首先是一些生命周期一览。
如下xml中是Activity的xml配置方法的一览以及简介,详细的介绍可以继续往下阅读。
<activity
<!--是否允许activity更换从属的任务,比如从短信息任务 切换到浏览器任务,默认false-->
android:allowTaskReparenting=["true" | "false"]
<!--是否保留状态不变,也就是切回home然后再打开,Activity是否处于最后状态-->
android:alwaysRetainTaskState=["true" | "false"]
<!--启动时候是否清空任务栈,默认是false。-->
android:clearTaskOnLaunch=["true" | "false"]
<!--一般用来设置Activity横竖屏切换时,不重新调用生命周期-->
android:configChanges=["mcc", "mnc", "locale",
"touchscreen", "keyboard", "keyboardHidden",
"navigation", "orientation", "screenLayout",
"fontScale", "uiMode"]
<!--activity 是否可以被实例化,-->
android:enabled=["true" | "false"]
<!--是否可被显示在最近打开的activity列表里 -->
android:excludeFromRecents=["true" | "false"]
<!--是否允许activity被其它程序调用-->
android:exported=["true" | "false"]
<!--当重新启动这个任务的时候,是否关闭已打开的Activity-->
android:finishOnTaskLaunch=["true" | "false"]
<!--是否为当前Activity启动硬件加速-->
android:hardwareAccelerated=["true" | "false"]
<!--Activity的图标-->
android:icon="drawable resource"
<!--Activity的标签-->
android:label="string resource"
<!--Activity的启动方式-->
android:launchMode=["multiple" | "singleTop" | "singleTask" | "singleInstance"]
<!--Activity的实例是否可以运行在启动它的组件所在的应用程序进程中,一般与progress搭配使用-->
android:multiprocess=["true" | "false"]
<!--类名,必须是Activity的子类-->
android:name="string"
<!--设置在用户离开该Activity,并且它在屏幕上不再可见的时候,是否应该从Activity的堆栈中删除-->
android:noHistory=["true" | "false"]
<!--别的应用访问当前Activity所需要的权限-->
android:permission="string"
<!--表示该Activity运行的进程名称。 -->
android:process="string"
<!--表示Activity显示的方向(比如纵向,横向-->
android:screenOrientation=["unspecified" | "user" | "behind" |
"landscape" | "portrait" |
"sensor" | "nosensor"]
<!--Activity是否能被终止以及是否能在还没有保存其状态的情况下成功重启-->
android:stateNotNeeded=["true" | "false"]
<!--Activity有亲和力的任务-->
android:taskAffinity="string"
<!--为Activity定义一个整体主题风格资源的引用-->
android:theme="resource or theme"
<!--Activity的主窗口如何与包含屏幕软键盘的窗口交互。-->
android:windowSoftInputMode=["stateUnspecified",
"stateUnchanged", "stateHidden",
"stateAlwaysHidden", "stateVisible",
"stateAlwaysVisible", "adjustUnspecified",
"adjustResize", "adjustPan"] >
</activity>
接下来是各个属性对应的详细分析:
-
android:allowTaskReparenting
- 是否允许activity更换从属的任务,默认是false。
- 可以这么理解:当设置值为true时,一个activity1原来属于task1,但是如果task2启动起来的话,activity1可能不再属于task1了,转而投奔task2去了。
- 举个例子来帮助理解:在短信中点击一个链接打开一个web页面,这个web页是由浏览器定义的,但却由短信应用启动了起来。如果把它设置归属于浏览器任务。那么下次打开浏览器时候,会显示这个页面,而打开短信并不会显示这个页面。
-
android:alwaysRetainTaskState
- 标记Activity的task是否保持原来的状态,“
true
”表示总是保持,“false
”表示不能够保证,默认为“false”。 - 这个属性只对任务的最顶端Activity有用,对于其他所有的Activity,会忽略这个属性
- 正常情况下,当用户从主屏幕重新选择某个任务时,系统会在特定情况下清除该任务(从根 Activity 之上的堆栈中移除所有 Activity)。 系统通常会在用户一段时间(如 30 分钟)内未访问任务时执行此操作。
- 如果该属性的值是“
true
”,则无论用户如何到达任务,将始终返回到最后状态的任务。 例如,在网络浏览器这类存在大量用户不愿失去的状态(如多个打开的标签)的应用中,该属性会很有用。
- 标记Activity的task是否保持原来的状态,“
-
android:clearTaskOnLaunch
- 是否每次重新启动任务时,都会移出除了启动页(主页)之外的所有Activity。
true
表示始终清除任务,false
表示不清楚。默认值为false
。 - 例如,用户从A页面跳转到B页面,然后点击home键。默认情况再次打开页面,显示的是B页面。如果设置为
true
再次打开页面会重新显示A页面。
- 是否每次重新启动任务时,都会移出除了启动页(主页)之外的所有Activity。
-
android:configChanges
列出某些状态发生改变时候,Activity不重启。当所列出的状态发生变更时候,Activity会调用
onConfigurationChanged()
方法。-
下列是每个值对应的说明:
值 说明 “ mcc
”IMSI 移动国家/地区代码 (MCC) 发生了变化 - 检测到了 SIM 并更新了 MCC。 “ mnc
”IMSI 移动网络代码 (MNC) 发生了变化 - 检测到了 SIM 并更新了 MNC。 “ locale
”语言区域发生了变化 — 用户为文本选择了新的显示语言。 “ touchscreen
”触摸屏发生了变化。(这种情况通常永远不会发生。) keyboard
”键盘类型发生了变化 — 例如,用户插入了一个外置键盘。 “ keyboardHidden
”键盘无障碍功能发生了变化 — 例如,用户显示了硬件键盘。 “ navigation
”导航类型(轨迹球/方向键)发生了变化。(这种情况通常永远不会发生。) “ screenLayout
”屏幕布局发生了变化 — 这可能是由激活了其他显示方式所致。 “ fontScale
”字体缩放系数发生了变化 — 用户选择了新的全局字号。 “ uiMode
”用户界面模式发生了变化 — 这可能是因用户将设备放入桌面/车载基座或夜间模式发生变化所致。 “ orientation
”屏幕方向发生了变化 — 用户旋转了设备。 “ screenSize
”当前可用屏幕尺寸发生了变化。它表示当前可用尺寸相对于当前纵横比的变化,因此会在用户在横向与纵向之间切换时发生变化 “ smallestScreenSize
”物理屏幕尺寸发生了变化。它表示与方向无关的尺寸变化,因此只有在实际物理屏幕尺寸发生变化(如切换到外部显示器)时才会变化。 “ layoutDirection
”布局方向发生了变化。例如,从从左至右 (LTR) 更改为从右至左 (RTL)。 此项为 API 级别 17 中新增配置。
-
android:enabled
- 系统是否可将 Activity 实例化 —
"true"
表示可以,“false
”表示不可以。 默认值为“true
”。 -
<application>
元素具有自己的enabled
属性,该属性适用于所有应用组件,包括 Activity。<application>
和<activity>
属性必须都是“true
”(因为它们都默认使用该值),系统才能将 Activity 实例化。 如果任何一个属性是“false
”,则无法进行实例化。
- 系统是否可将 Activity 实例化 —
-
android:excludeFromRecents
- 是否将Activity显示在最近使用程序列表中。也就是在主屏幕点击菜单键是否能够看到当前Activity的预览。
-
android:exported
- Activity 是否可由其他应用的组件启动 —“
true
”表示可以,“false
”表示不可以。若为“false
”,则 Activity 只能由同一应用的组件或使用同一用户 ID 的不同应用启动。 - 默认值取决于 Activity 是否包含 Intent 过滤器。没有任何过滤器意味着 Activity 只能通过指定其确切的类名称进行调用。 这意味着 Activity 专供应用内部使用(因为其他应用不知晓其类名称)。 因此,在这种情况下,默认值为“
false
”。另一方面,至少存在一个过滤器意味着 Activity 专供外部使用,因此默认值为“true
”。 - 该属性并非限制 Activity 对其他应用开放度的唯一手段。 您还可以利用权限(即
permission
属性)来限制哪些外部实体可以调用 Activity。
- Activity 是否可由其他应用的组件启动 —“
-
android:finishOnTaskLaunch
- 每当用户再次启动其任务(在主屏幕上选择任务)时,是否应关闭现有 Activity 实例 —“
true
”表示应关闭,“false
”表示不应关闭。 默认值为“false
”。 - 如果该属性和
allowTaskReparenting
均为“true
”,则优先使用该属性。 Activity 的亲和关系会被忽略。 系统不是更改 Activity 的父项,而是将其销毁。
- 每当用户再次启动其任务(在主屏幕上选择任务)时,是否应关闭现有 Activity 实例 —“
-
android:hardwareAccelerated
- 是否对Activity启用硬件加速。默认值是
false
- 从 Android 3.0 开始,为应用提供了硬件加速 OpenGL 渲染器,以改善许多常见 2D 图形运算的性能。 启用硬件加速渲染器时,Canvas、Paint、Xfermode、ColorFilter、Shader 和 Camera 中的大多数运算都会得到加速。这可以提高动画、滚动的流畅度和总体响应速度,即便是并不明确使用框架 OpenGL 库的应用也会受益。 由于启用硬件加速会增加资源消耗,因此您的应用将占用更多内存。
- 注意:并非所有 OpenGL 2D 运算都会得到加速。如果您启用硬件加速渲染器,请对应用进行测试,以确保其在利用渲染器时不会出错。
- 是否对Activity启用硬件加速。默认值是
-
android:icon
- 代表Activity的图片,这个图片会在需要在屏幕上表示Activity时展示给用户。
- 必须使用图片资源来设置这个值。如果未设置,会使用Application中对应的属性。
-
android:label
- 会在屏幕上显示的Activity标签,通常和上面的icon一起出现
-
android:launchMode
- 用来设置android的启动方式,分为如下四种方式
- singleTop:如果当前Activity处于栈顶,那么直接复用,否则重新启动Activity
- singeTask:如果当前任务栈中存在,则把Activity移动到栈顶,并且关闭当前Activity之上的Activity
- singeInstance:在新的任务栈中启动一个Activity,下次再启动时候,如果存在就不新建了。
- standard(默认):正常启动,每次都会新建一个Activity
- 用来设置android的启动方式,分为如下四种方式
-
android:multiprocess
- 是否可以将 Activity 实例启动到启动该实例的组件进程内 —“
true
”表示可以,“false
”表示不可以。默认值为“false
”。 - 正常情况下,新的 Activity 实例会启动到定义它的应用进程内,因此所有 Activity 实例都在同一进程内运行。 不过,如果该标志设置为“
true
”,Activity 实例便可在多个进程内运行,这样系统就能在任何使用实例的地方创建实例(前提是权限允许这样做),但这几乎毫无必要性或可取之处。
- 是否可以将 Activity 实例启动到启动该实例的组件进程内 —“
-
android:name
- 当前Activity对应的路径,必须设置。
-
android:noHistory
- 当Activity不可见时候,是否结束该Activity。默认值为false。
- “
true
”一值表示 Activity 不会留下历史轨迹。 它不会留在任务的 Activity 堆栈内,因此用户将无法返回 Activity。 在此情况下,如果您启动另一个 Activity 来获取该 Activity 的结果,系统永远不会调用onActivityResult()
。 - 利用这个性质可以设计一些阅后即焚的软件界面。
-
android:permission
- 从其他应用启动该Activity时候必须具备的权限。
- 如果未设置该属性,则对 Activity 应用
<application>
元素的permission
属性设置的权限。 如果这两个属性均未设置,则 Activity 不受权限保护。
-
android:process
- 运行Activity的进程名称。Activity都会运行在默认进程中。
- 可以使用该属性替换默认进程名称,以便让应用组件散布到多个进程中。为该属性分配的名称以冒号(“:”)开头,则会在需要时创建应用专用的新进程,并且 Activity 会在该进程中运行。如果进程名称以小写字符开头,Activity 将在该名称的全局进程中运行,前提是它拥有相应的权限。这可以让不同应用中的组件共享一个进程,从而减少资源占用。
-
android:screenOrientation
Activity 在设备上的显示方向。如果 Activity 是在多窗口模式下运行,系统会忽略该属性。
-
具体各个状态与屏幕的对应关系如下:
值 描述 “ unspecified
”默认值。由系统选择方向。在不同设备上,系统使用的政策以及基于政策在特定上下文所做的选择可能有所差异。 “ behind
”与 Activity 栈中紧接着它的 Activity 的方向相同。 “ landscape
”横向方向(显示的宽度大于高度)。 “ portrait
”纵向方向(显示的高度大于宽度)。 “ reverseLandscape
”与正常横向方向相反的横向方向。API 级别 9 中的新增配置。 “ reversePortrait
”与正常纵向方向相反的纵向方向。API 级别 9 中的新增配置。 “ sensorLandscape
”横向方向,但根据设备传感器,可以是正常或反向的横向方向。API 级别 9 中的新增配置。 “ sensorPortrait
”纵向方向,但根据设备传感器,可以是正常或反向的纵向方向。API 级别 9 中的新增配置。 “ userLandscape
”横向方向,但根据设备传感器和用户的传感器首选项,可以是正常或反向的横向方向。 如果用户锁定了基于传感器的旋转,其行为与 landscape
相同,否则,其行为与sensorLandscape
相同。API 级别 18 中的新增配置。“ userPortrait
”纵向方向,但根据设备传感器和用户的传感器首选项,可以是正常或反向的纵向方向。 如果用户锁定了基于传感器的旋转,其行为与 portrait
相同,否则,其行为与sensorPortrait
相同。API 级别 18 中的新增配置。“ sensor
”方向由设备方向传感器决定。显示方向取决于用户如何手持设备,它会在用户旋转设备时发生变化。 但一些设备默认情况下不会旋转到所有四种可能的方向。要允许全部四种方向,请使用 "fullSensor"
。“ fullSensor
”方向由 4 种方向中任一方向的设备方向传感器决定。这与 "sensor"
类似,不同的是它允许所有 4 种可能的屏幕方向,无论设备正常情况下采用什么方向(例如,一些设备正常情况下不使用反向纵向或反向横向,但它支持这些方向)。 API 级别 9 中的新增配置。“ nosensor
”决定方向时不考虑物理方向传感器。传感器会被忽略,因此显示不会随用户对设备的移动而旋转。 除了这个区别,系统在选择方向时使用的政策与“ unspecified
”设置相同。“ user
”用户当前的首选方向。 " fullUser
"如果用户锁定了基于传感器的旋转,其行为与 user
相同,否则,其行为与fullSensor
相同,允许所有 4 种可能的屏幕方向。 API 级别 18 中的新增配置。“ locked
”将方向锁定在其当前的任意旋转方向。API 级别 18 中的新增配置。
-
android:stateNotNeeded
- 当Activity被异常终止时候,是否调用
onSaveInstanceState()
方法。默认是false
-调用 - 正常情况下,为保存资源而暂时关闭 Activity 前,系统会调用其
onSaveInstanceState()
方法。 该方法将 Activity 的当前状态存储在一个Bundle
对象中,然后在 Activity 重新启动时将其传递给onCreate()
。 如果该属性设置为“true
”,系统可能不会调用onSaveInstanceState()
,并且会向onCreate()
传递null
而不是 Bundle - 这与它在 Activity 首次启动时完全一样。 - “
true
”设置可确保 Activity 能够在未保留状态时重新启动。 例如,显示主屏幕的 Activity 可以使用该设置来确保其由于某种原因崩溃时不会被移除。
- 当Activity被异常终止时候,是否调用
-
android:taskAffinity
- Activity的归属,也就是Activity应该在哪个Task中,Activity与Task的吸附关系。
- 一般情况下,Activity会一直处于创建它的Task中。通过设置本属性,可以把 Activity 分为不同的组,甚至可以把不同应用程序的 Activity 放入同一个任务里。 要把 Activity 设置为不带 affinity ,也即不属于任何任务,只要将本属性设为空字符串即可。
- 每个Activity都有taskAffinity属性,这个属性指出了它希望进入的Task。如果一个Activity没有显式的指明该 Activity的taskAffinity,那么它的这个属性就等于Application指明的taskAffinity,如果 Application也没有指明,那么该taskAffinity的值就等于包名。
- 在实际应用中一般会出现两种情况:
- 如果该Activity的allowTaskReparenting设置为true,它进入后台,当一个和它有相同affinity的Task进入前台时,它会重新宿主,进入到该前台的task中。
- 如果加载某个Activity的intent,Flag被设置成FLAG_ACTIVITY_NEW_TASK时,它会首先检查是否存在与自己taskAffinity相同的Task,如果存在,那么它会直接宿主到该Task中,如果不存在则重新创建Task
-
android:theme
- 设置Activity的主题。
-
android:windowSoftInputMode
-
Activity 的主窗口与包含屏幕软键盘的窗口的交互方式。 该属性的设置影响两个方面:
- 当 Activity 成为用户注意的焦点时软键盘的状态 — 隐藏还是可见。
- 对 Activity 主窗口所做的调整 — 是否将其尺寸调小以为软键盘腾出空间,或者当窗口部分被软键盘遮挡时是否平移其内容以使当前焦点可见。
各个属性对应的键盘状态如下所示:
值 说明 " stateUnspecified
"不指定软键盘的状态(隐藏还是可见)。 将由系统选择合适的状态,或依赖主题中的设置。这是对软键盘行为的默认设置。 “ stateUnchanged
”当 Activity 转至前台时保留软键盘最后所处的任何状态,无论是可见还是隐藏。 “ stateHidden
”启动Activity时,始终是隐藏键盘的。如果从别的界面返回,就会视上次的情况而定 “ stateAlwaysHidden
”不论什么情况,只要该Activity获取焦点时候,键盘隐藏 “ stateVisible
”在正常的适宜情况下(当用户向前导航到 Activity 的主窗口时)显示软键盘。 “ stateAlwaysVisible
”启动Activity时候显示键盘。从上级界面返回时候不管 “ adjustUnspecified
”系统会根据窗口的内容是否存在可以滚动的视图来选择键盘的展示方式。 如果存在滚动视图且可通过滚动在较小区域内看到窗口的所有内容,窗口将进行尺寸调整。 “ adjustResize
”始终调整 Activity 主窗口的尺寸来为屏幕上的软键盘腾出空间。 “ adjustPan
”不调整 Activity 主窗口的尺寸来为软键盘腾出空间, 而是自动平移窗口的内容,使当前焦点永远不被键盘遮盖,让用户始终都能看到其输入的内容。 这通常不如尺寸调正可取,因为用户可能需要关闭软键盘以到达被遮盖的窗口部分或与这些部分进行交互。
-