Activity详解——Activity的xml配置

首先是一些生命周期一览。

如下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”,则无论用户如何到达任务,将始终返回到最后状态的任务。 例如,在网络浏览器这类存在大量用户不愿失去的状态(如多个打开的标签)的应用中,该属性会很有用。
  • android:clearTaskOnLaunch

    • 是否每次重新启动任务时,都会移出除了启动页(主页)之外的所有Activity。true表示始终清除任务,false表示不清楚。默认值为false
    • 例如,用户从A页面跳转到B页面,然后点击home键。默认情况再次打开页面,显示的是B页面。如果设置为true再次打开页面会重新显示A页面。
  • 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”,则无法进行实例化。
  • android:excludeFromRecents

    • 是否将Activity显示在最近使用程序列表中。也就是在主屏幕点击菜单键是否能够看到当前Activity的预览。
  • android:exported

    • Activity 是否可由其他应用的组件启动 —“true”表示可以,“false”表示不可以。若为“false”,则 Activity 只能由同一应用的组件或使用同一用户 ID 的不同应用启动。
    • 默认值取决于 Activity 是否包含 Intent 过滤器。没有任何过滤器意味着 Activity 只能通过指定其确切的类名称进行调用。 这意味着 Activity 专供应用内部使用(因为其他应用不知晓其类名称)。 因此,在这种情况下,默认值为“false”。另一方面,至少存在一个过滤器意味着 Activity 专供外部使用,因此默认值为“true”。
    • 该属性并非限制 Activity 对其他应用开放度的唯一手段。 您还可以利用权限(即permission属性)来限制哪些外部实体可以调用 Activity。
  • android:finishOnTaskLaunch

    • 每当用户再次启动其任务(在主屏幕上选择任务)时,是否应关闭现有 Activity 实例 —“true”表示应关闭,“false”表示不应关闭。 默认值为“false”。
    • 如果该属性和 allowTaskReparenting 均为“true”,则优先使用该属性。 Activity 的亲和关系会被忽略。 系统不是更改 Activity 的父项,而是将其销毁。
  • android:hardwareAccelerated

    • 是否对Activity启用硬件加速。默认值是false
    • 从 Android 3.0 开始,为应用提供了硬件加速 OpenGL 渲染器,以改善许多常见 2D 图形运算的性能。 启用硬件加速渲染器时,Canvas、Paint、Xfermode、ColorFilter、Shader 和 Camera 中的大多数运算都会得到加速。这可以提高动画、滚动的流畅度和总体响应速度,即便是并不明确使用框架 OpenGL 库的应用也会受益。 由于启用硬件加速会增加资源消耗,因此您的应用将占用更多内存。
    • 注意:并非所有 OpenGL 2D 运算都会得到加速。如果您启用硬件加速渲染器,请对应用进行测试,以确保其在利用渲染器时不会出错。
  • android:icon

    • 代表Activity的图片,这个图片会在需要在屏幕上表示Activity时展示给用户。
    • 必须使用图片资源来设置这个值。如果未设置,会使用Application中对应的属性。
  • android:label

    • 会在屏幕上显示的Activity标签,通常和上面的icon一起出现
  • android:launchMode

    • 用来设置android的启动方式,分为如下四种方式
      • singleTop:如果当前Activity处于栈顶,那么直接复用,否则重新启动Activity
      • singeTask:如果当前任务栈中存在,则把Activity移动到栈顶,并且关闭当前Activity之上的Activity
      • singeInstance:在新的任务栈中启动一个Activity,下次再启动时候,如果存在就不新建了。
      • standard(默认):正常启动,每次都会新建一个Activity
  • android:multiprocess

    • 是否可以将 Activity 实例启动到启动该实例的组件进程内 —“true”表示可以,“false”表示不可以。默认值为“false”。
    • 正常情况下,新的 Activity 实例会启动到定义它的应用进程内,因此所有 Activity 实例都在同一进程内运行。 不过,如果该标志设置为“true”,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 可以使用该设置来确保其由于某种原因崩溃时不会被移除。
  • 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 主窗口的尺寸来为软键盘腾出空间, 而是自动平移窗口的内容,使当前焦点永远不被键盘遮盖,让用户始终都能看到其输入的内容。 这通常不如尺寸调正可取,因为用户可能需要关闭软键盘以到达被遮盖的窗口部分或与这些部分进行交互。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容