<activity>

语法
<activity android:allowEmbedded=["true" | "false"]
          android:allowTaskReparenting=["true" | "false"]
          android:alwaysRetainTaskState=["true" | "false"]
          android:autoRemoveFromRecents=["true" | "false"]
          android:banner="drawable resource"
          android:canDisplayOnRemoteDevices=["true" | "false"]
          android:clearTaskOnLaunch=["true" | "false"]
          android:colorMode=[ "hdr" | "wideColorGamut"]
          android:configChanges=["colorMode", "density",
                                 "fontScale", "fontWeightAdjustment",
                                 "grammaticalGender", "keyboard",
                                 "keyboardHidden", "layoutDirection", "locale",
                                 "mcc", "mnc", "navigation", "orientation",
                                 "screenLayout", "screenSize",
                                 "smallestScreenSize", "touchscreen", "uiMode"]
          android:directBootAware=["true" | "false"]
          android:documentLaunchMode=["intoExisting" | "always" |
                                  "none" | "never"]
          android:enabled=["true" | "false"]
          android:enableOnBackInvokedCallback=["true" | "false"]
          android:excludeFromRecents=["true" | "false"]
          android:exported=["true" | "false"]
          android:finishOnTaskLaunch=["true" | "false"]
          android:hardwareAccelerated=["true" | "false"]
          android:icon="drawable resource"
          android:immersive=["true" | "false"]
          android:label="string resource"
          android:launchMode=["standard" | "singleTop" |
                              "singleTask" | "singleInstance" | "singleInstancePerTask"]
          android:lockTaskMode=["normal" | "never" |
                              "if_whitelisted" | "always"]
          android:maxRecents="integer"
          android:maxAspectRatio="float"
          android:minAspectRatio="float"
          android:multiprocess=["true" | "false"]
          android:name="string"
          android:noHistory=["true" | "false"]  
          android:parentActivityName="string" 
          android:persistableMode=["persistRootOnly" | 
                                   "persistAcrossReboots" | "persistNever"]
          android:permission="string"
          android:process="string"
          android:relinquishTaskIdentity=["true" | "false"]
          android:requireContentUriPermissionFromCaller=["none" | "read" | "readAndWrite" |
                                                         "readOrWrite" | "write"] 
          android:resizeableActivity=["true" | "false"]
          android:screenOrientation=["unspecified" | "behind" |
                                     "landscape" | "portrait" |
                                     "reverseLandscape" | "reversePortrait" |
                                     "sensorLandscape" | "sensorPortrait" |
                                     "userLandscape" | "userPortrait" |
                                     "sensor" | "fullSensor" | "nosensor" |
                                     "user" | "fullUser" | "locked"]
          android:showForAllUsers=["true" | "false"]
          android:stateNotNeeded=["true" | "false"]
          android:supportsPictureInPicture=["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>
<layout>
说明
声明一个活动(Activity 子类),该活动实现了应用程序可视化用户界面的一部分。所有活动必须通过清单文件中的 <activity> 元素来表示。任何未在此处声明的活动,系统将不会识别,也永远不会运行。
属性
android:allowEmbedded

指示活动是否可以作为另一个活动的嵌入式子项启动,特别是当子项位于由另一个活动拥有的 Display 等容器中时。例如,用于 Wear 自定义通知的活动声明此属性,以便 Wear 可以在其上下文流中显示活动,该流位于另一个进程中。

此属性的默认值为 false

android:allowTaskReparenting
当任务下次被带到前台时,活动是否可以从启动它的任务移动到它具有亲和性的任务。如果可以移动,则为 "true";如果仍保留在启动它的任务中,则为 "false"

如果未设置此属性,则 <application> 元素的相应 allowTaskReparenting 属性设置的值将应用于此活动。默认值为 "false"

通常,当一个活动启动时,它会与启动它的活动的任务相关联,并在此处保留其整个生命周期。您可以使用此属性强制它在其当前任务不再显示时,重新分配到它具有亲和性的任务。通常,这用于使应用程序的活动移动到与该应用程序相关联的主任务。

例如,如果一封电子邮件包含指向网页的链接,点击该链接会启动一个可以显示该页面的活动。该活动由浏览器应用程序定义,但作为电子邮件任务的一部分启动。如果它被重新分配到浏览器任务,当浏览器下次显示在前台时它会显示,而当电子邮件任务再次显示在前台时它将不存在。

活动的亲和性由 taskAffinity 属性定义。任务的亲和性由其根活动的亲和性决定。因此,根据定义,根活动始终位于具有相同亲和性的任务中。由于具有 "singleTask""singleInstance" 启动模式的活动只能位于任务的根目录,因此重新分配仅限于 "standard""singleTop" 模式。(另请参阅 launchMode 属性。)

android:alwaysRetainTaskState
活动所在任务的状态是否始终由系统维护。如果是,则为 "true";如果系统在某些情况下可以将任务重置为其初始状态,则为 "false"。默认值为 "false"。此属性仅对任务的根活动有意义。对于所有其他活动,此属性将被忽略。

通常,在某些情况下,当用户从主屏幕重新选择任务时,系统会清除任务,从根活动上方的堆栈中移除所有活动。通常,如果用户在一定时间(例如 30 分钟)内未访问该任务,就会执行此操作。

但是,当此属性为 "true" 时,用户始终会返回到任务的最后状态,无论他们如何到达那里。这在 Web 浏览器等应用程序中很有用,因为其中有大量状态(例如多个打开的标签页)用户不希望丢失。

android:autoRemoveFromRecents
由具有此属性的活动启动的任务是否保留在最近使用的应用屏幕中,直到任务中的最后一个活动完成。如果为 true,则任务会自动从最近使用的应用屏幕中移除。这会覆盖调用方对 FLAG_ACTIVITY_RETAIN_IN_RECENTS 的使用。它必须是布尔值,可以是 "true""false"
android:banner
一个可绘制资源,为其关联的项提供一个扩展的图形横幅。与 <activity> 标记一起使用,为特定活动提供默认横幅,或与<application> 标记一起使用,为所有应用程序活动提供横幅。

系统使用横幅在 Android TV 主屏幕中表示应用。由于横幅仅显示在主屏幕中,因此它仅由具有处理 CATEGORY_LEANBACK_LAUNCHER intent 的活动的应用程序指定。

此属性设置为对包含图像定义的可绘制资源的引用,例如 "@drawable/banner"。没有默认横幅。

有关更多信息,请参阅《TV 应用入门》中的提供主屏幕横幅

android:canDisplayOnRemoteDevices

指示活动是否可以在远程设备上显示,该设备可能正在运行 Android,也可能没有。它必须是布尔值,可以是 "true""false"

此属性的默认值为 "true"

android:clearTaskOnLaunch
当从主屏幕重新启动任务时,是否从任务中移除所有活动,除了根活动。"true" 表示任务始终被清除到其根活动,"false" 表示不清除。默认值为 "false"。此属性仅对启动新任务的活动(即根活动)有意义。对于任务中的所有其他活动,它将被忽略。

当值为 "true" 时,每次用户启动任务时,都会进入其根活动,无论他们上次在任务中做了什么,也无论他们是使用返回按钮还是主页按钮离开任务。当值为 "false" 时,任务可以在某些情况下清除活动,但并非总是如此。有关更多信息,请参阅 alwaysRetainTaskState 属性。

假设用户从主屏幕启动活动 P,然后从 P 进入活动 Q。用户接下来点击主页,然后返回活动 P。通常,用户会看到活动 Q,因为那是他们上次在 P 的任务中进行的操作。但是,如果 P 将此标志设置为 "true",则当用户从主屏幕启动活动 P 时,其上方的所有活动(在此示例中为 Q)都将被移除。因此,当返回任务时,用户只看到 P。

如果此属性和 allowTaskReparenting 都为 "true",则任何可以重新分配父项的活动都将移动到它们共享亲和性的任务中。其余活动将被丢弃。

如果未设置 FLAG_ACTIVITY_RESET_TASK_IF_NEEDED,则此属性将被忽略。

android:colorMode

指定活动的颜色模式。如果指定,可以是 hdrwideColorGamut

如果为 hdr,则要求如果设备支持,活动以高动态范围显示。

如果为 wideColorGamut,则要求活动在兼容设备上以广色域模式显示。在广色域模式下,窗口可以渲染到 SRGB 色域之外,以显示更鲜艳的颜色。如果设备不支持广色域渲染,此属性无效。有关在广色域模式下渲染的更多信息,请参阅使用广色域内容增强图形效果

android:configChanges
列出活动自行处理的配置更改。默认情况下,当运行时发生配置更改时,活动会关闭并重新启动,但使用此属性声明配置可以防止活动重新启动。相反,活动会继续运行,并且会调用其 onConfigurationChanged() 方法。

注意:仅在特殊情况下使用此属性,以提高应用程序性能和响应能力。有关更多信息,请参阅处理配置更改

以下字符串是此属性的有效值。多个值之间用 | 分隔,例如 "locale|navigation|orientation"

说明
"colorMode"

屏幕的颜色模式功能(色域或动态范围)已更改。

注意:活动通过 colorMode 属性或在运行时请求的颜色模式与不同颜色模式的功能是不同的。活动更改其使用的颜色模式不会导致配置更改,因为显示的颜色功能未更改。

"density"

显示密度发生变化,例如用户指定了不同的显示比例或不同的显示器当前处于活动状态。

在 API 级别 24 中添加.

"fontScale" 字体缩放因子发生变化,例如用户选择了新的全局字体大小。
"fontWeightAdjustment" 字体粗细增加的量已更改。
"grammaticalGender" 语言的语法性别已更改。请参阅 GrammaticalInflectionManager

在 API 级别 34 中添加.

"keyboard" 键盘类型发生变化,例如用户插入了外部键盘。
"keyboardHidden" 键盘可访问性发生变化,例如用户显示了硬件键盘。
"layoutDirection"

布局方向发生变化,例如从从左到右 (LTR) 变为从右到左 (RTL)。

在 API 级别 17 中添加.

"locale" 语言区域发生变化,例如用户选择了用于显示文本的新语言。
"mcc" 当检测到更新 MCC 的 SIM 卡时,IMSI 移动国家代码 (MCC) 发生变化。
"mnc" 当检测到更新 MNC 的 SIM 卡时,IMSI 移动网络代码 (MNC) 发生变化。
"navigation" 导航类型(轨迹球或 D-pad)发生变化。通常,这种情况不会发生。
"orientation"

屏幕方向发生变化,例如用户旋转设备时。

注意:如果您的应用程序面向 Android 3.2 (API 级别 13) 或更高版本,还要声明 "screenLayout""screenSize" 配置,因为当设备在纵向和横向之间切换时,屏幕布局和屏幕尺寸可能会发生变化。

"screenLayout" 屏幕布局发生变化,例如当不同的显示器变为活动状态时。
"screenSize"

当前可用屏幕尺寸发生变化。

这表示相对于当前宽高比的当前可用尺寸的变化,因此当用户在横向和纵向之间切换时会发生变化。

在 API 级别 13 中添加.

"smallestScreenSize"

物理屏幕尺寸发生变化。

这表示无论方向如何,尺寸都会发生变化,因此它只在实际物理屏幕尺寸发生变化时发生变化,例如切换到外部显示器。此配置的更改对应于 smallestWidth 配置的更改。

在 API 级别 13 中添加.

"touchscreen" 触摸屏发生变化。通常,这种情况不会发生。
"uiMode" 用户界面模式发生变化,例如用户将设备放入桌面或车载底座,或夜间模式发生变化。有关不同 UI 模式的更多信息,请参阅 UiModeManager

在 API 级别 8 中添加.

所有这些配置更改都会影响应用程序可见的资源值。因此,当调用 onConfigurationChanged() 时,通常需要再次检索所有资源,包括视图布局和可绘制对象,以正确处理更改。

注意:要处理多窗口相关的配置更改,请同时使用 "screenLayout""smallestScreenSize"。多窗口功能在 Android 7.0 (API 级别 24) 或更高版本中受支持。

android:directBootAware

活动是否为直接启动感知——即,它是否可以在用户解锁设备之前运行。

注意:直接启动期间,您应用程序中的活动只能访问存储在设备保护存储中的数据。

默认值为 "false"

android:documentLaunchMode
指定每次启动活动时,如何将活动的新实例添加到任务中。此属性允许用户在最近使用的应用屏幕中显示来自同一应用程序的多个文档。

此属性有四个值,当用户使用应用程序打开文档时,会产生以下效果:

说明
"intoExisting" 系统会搜索一个任务,其基本 intent 的 ComponentName 和数据 URI 与启动 intent 匹配。如果系统找到这样的任务,系统会清除该任务并重新启动,根活动将收到 onNewIntent(android.content.Intent) 调用。如果系统未找到此类任务,系统会创建一个新任务。
"always" 即使文档已打开,活动也会为文档创建一个新任务。这与同时设置 FLAG_ACTIVITY_NEW_DOCUMENTFLAG_ACTIVITY_MULTIPLE_TASK 标志的效果相同。
"none" 活动不会为活动创建新任务。这是默认值,仅当设置了 FLAG_ACTIVITY_NEW_TASK 时才创建新任务。最近使用的应用屏幕会按默认方式处理活动:它会显示应用的单个任务,该任务从用户上次调用的活动恢复。
"never" 即使 intent 包含 FLAG_ACTIVITY_NEW_DOCUMENT,活动也不会作为新文档启动。设置此选项会覆盖 FLAG_ACTIVITY_NEW_DOCUMENTFLAG_ACTIVITY_MULTIPLE_TASK 标志的行为(如果其中任何一个在活动中设置),并且最近使用的应用屏幕会显示应用的单个任务,该任务从用户上次调用的活动恢复。

注意:对于 "none""never" 以外的值,活动使用 launchMode="standard" 定义。如果未指定此属性,则使用 documentLaunchMode="none"

android:enabled
活动是否可以由系统实例化。如果可以,则为 "true";否则为 "false"。默认值为 "true"

<application> 元素有自己的 enabled 属性,适用于所有应用程序组件,包括活动。<application><activity> 属性都必须为 "true"(它们都默认为 "true"),系统才能实例化该活动。如果其中任何一个为 "false",则无法实例化。

android:enableOnBackInvokedCallback

此标志允许您在活动级别选择退出预测性系统动画。

设置 android:enableOnBackInvokedCallback=false 以在活动级别关闭预测性返回动画,并指示系统忽略对 OnBackInvokedCallback 平台 API 的调用。

android:excludeFromRecents

由此活动启动的任务是否从最近使用的应用屏幕中排除。也就是说,当此活动是新任务的根活动时,此属性确定该任务是否出现在最近使用的应用列表中。如果该任务从列表中排除,则为 "true";如果包含,则为 "false"。默认值为 "false"

android:exported

活动是否可以由其他应用程序的组件启动

  • 如果为 "true",则该活动对任何应用都可访问,并且可以通过其精确的类名启动。
  • 如果为 "false",则该活动只能由同一应用程序的组件、具有相同用户 ID 的应用程序或特权系统组件启动。当没有 intent 过滤器时,这是默认值。

如果您应用中的活动包含 intent 过滤器,请将此元素设置为 "true" 以允许其他应用启动它。例如,如果活动是应用的主要活动并包含 category android.intent.category.LAUNCHER

如果此元素设置为 "false",并且应用尝试启动该活动,系统将抛出 ActivityNotFoundException

此属性不是限制活动对其他应用程序公开的唯一方法。权限也用于限制可以调用活动的外部实体。请参阅 permission 属性。

android:finishOnTaskLaunch
当用户通过在主屏幕上选择任务来重新启动其任务时,除了根活动之外,活动的现有实例是否关闭。如果关闭,则为 "true";否则为 "false"。默认值为 "false"

如果此属性和 allowTaskReparenting 都为 "true",则此属性优先于另一个。活动的亲和性将被忽略。活动不会重新分配父项,而是被销毁。

如果未设置 FLAG_ACTIVITY_RESET_TASK_IF_NEEDED,则此属性将被忽略。

android:hardwareAccelerated
是否为该活动启用硬件加速渲染。如果启用,则为 "true";否则为 "false"。默认值为 "false"

在 Android 3.0 及更高版本上,应用程序可以使用硬件加速的 OpenGL 渲染器,以提高许多常见 2D 图形操作的性能。当启用硬件加速渲染器时,Canvas、Paint、Xfermode、ColorFilter、Shader 和 Camera 中的大多数操作都会加速。

这会带来更流畅的动画、更平滑的滚动和整体改进的响应能力,即使对于未明确使用框架的 OpenGL 库的应用程序也是如此。由于启用硬件加速所需的资源增加,您的应用程序会消耗更多 RAM。

并非所有 OpenGL 2D 操作都经过加速。如果启用硬件加速渲染器,请测试您的应用程序是否可以在不发生错误的情况下使用渲染器。

android:icon

表示活动的图标。当需要在屏幕上表示活动时,会向用户显示此图标。例如,启动任务的活动图标会显示在启动器窗口中。该图标通常伴随着一个标签;有关标签的信息,请参阅 android:label 属性。

此属性设置为对包含图像定义的可绘制资源的引用。如果未设置,则使用为整个应用程序指定的图标。有关更多信息,请参阅 <application> 元素的 icon 属性。

活动的图标,无论是在此处设置还是由 <application> 元素设置,也是所有活动 intent 过滤器的默认图标。有关更多信息,请参阅 <intent-filter> 元素的 icon 属性。

android:immersive
设置当前活动的沉浸模式设置。如果为 "true",则 ActivityInfo.flags 成员始终将其 FLAG_IMMERSIVE 位设置为 1,即使在运行时使用 setImmersive() 方法更改沉浸模式。
android:label

活动的供用户阅读的标签。当活动向用户呈现时,标签会显示在屏幕上。它通常与活动图标一起显示。如果未设置此属性,则使用为整个应用程序设置的标签。请参阅 <application> 元素的 label 属性。

活动的标签,无论是在此处设置还是由 <application> 元素设置,也是所有活动 intent 过滤器的默认标签。有关更多信息,请参阅 <intent-filter> 元素的 label 属性。

标签设置为对字符串资源的引用,以便它可以像用户界面中的其他字符串一样进行本地化。但是,为了方便应用程序开发,它也可以设置为原始字符串。

android:launchMode

关于活动如何启动的指令。共有五种模式,它们与 Intent 对象中的活动标志 (FLAG_ACTIVITY_* 常量) 协同工作,以确定当活动被要求处理 intent 时发生的情况:

"standard"
"singleTop"
"singleTask"
"singleInstance"
"singleInstancePerTask"

默认模式为 "standard"

如下表所示,这些模式分为两大类,"standard""singleTop" 活动在一侧,"singleTask""singleInstance""singleInstancePerTask" 活动在另一侧。具有 "standard""singleTop" 启动模式的活动可以多次实例化。

实例可以属于任何任务,并且可以位于活动任务中的任何位置。通常,它们会启动到调用 startActivity() 的任务中,除非 Intent 对象包含 FLAG_ACTIVITY_NEW_TASK 指令,在这种情况下会选择不同的任务。有关更多信息,请参阅 taskAffinity 属性。

相比之下,"singleTask""singleInstance""singleInstancePerTask" 活动具有不同的行为。"singleInstancePerTask" 始终位于活动任务的根部。此外,设备一次只能持有一个 "singleInstance" 活动的实例,而 "singleInstancePerTask 活动可以在设置了 FLAG_ACTIVITY_MULTIPLE_TASKFLAG_ACTIVITY_NEW_DOCUMENT 时,在不同的任务中多次实例化。

具有 "singleTask" 启动模式的活动结合了 "singleInstance""singleInstancePerTask" 的行为:活动可以多次实例化,并且可以位于具有相同 taskAffinity 的任务中的任何位置。但设备只能为 "singleTask" 活动在活动任务的根目录中定位一个任务。

"standard""singleTop" 模式在一个方面有所不同:每当有一个新的 intent 用于 "standard" 活动时,都会创建一个新的类实例来响应该 intent。每个实例处理一个 intent。同样,也可以创建一个 "singleTop" 活动的新实例来处理新的 intent。

但是,如果目标任务的堆栈顶部已经存在该活动的现有实例,则该实例会通过 onNewIntent() 调用接收新的 intent。不会创建新实例。否则——如果 "singleTop" 活动的现有实例位于目标任务中但不在堆栈顶部,或者它在堆栈顶部但不在目标任务中——则会创建一个新实例并推送到堆栈上。

同样,如果用户向上导航到当前堆栈上的活动,则行为由父活动的启动模式决定。如果父活动具有启动模式 singleTop(或 up intent 包含 FLAG_ACTIVITY_CLEAR_TOP),则父活动会被带到堆栈顶部,并且其状态得以保留。

导航 intent 由父活动的 onNewIntent() 方法接收。如果父活动具有启动模式 standard,并且 up intent 不包含 FLAG_ACTIVITY_CLEAR_TOP,则当前活动及其父活动都会从堆栈中弹出,并创建一个父活动的新实例以接收导航 intent。

"singleInstance" 模式与 "singleTask""singleInstancePerTask" 模式也仅在一个方面不同:具有 "singleTask""singleInstancePerTask" 启动模式的活动允许其他活动(必然是 "standard""singleTop" 活动)成为其任务的一部分。

另一方面,"singleInstance" 活动不允许任何其他活动成为其任务的一部分。它必须是任务中唯一的活动。如果它启动另一个活动,则该活动将被分配到不同的任务,就好像 intent 中包含 FLAG_ACTIVITY_NEW_TASK 一样。

用例 启动模式 多个实例? 评论
大多数活动的正常启动 "standard" 默认。系统总是在目标任务中创建活动的新实例,并将 intent 路由到该实例。
"singleTop" 有条件 如果活动实例已存在于目标任务的顶部,系统会将 intent 通过对其 onNewIntent() 方法的调用路由到该实例,而不是创建活动的新实例。
特殊启动
(不建议一般使用)
"singleTask" 有条件 系统在新的任务的根目录创建活动,或在具有相同亲和性的现有任务上定位活动。如果活动的实例已经存在并位于任务的根目录,系统会通过对其 onNewIntent() 方法的调用路由 intent 到现有实例,而不是创建新的实例。
"singleInstance" "singleTask" 相同,除了系统不会将任何其他活动启动到持有实例的任务中。活动始终是其任务中唯一的成员。
"singleInstancePerTask" 有条件 活动只能作为任务的根活动运行,即创建任务的第一个活动,因此在任务中此活动只有一个实例。但是,此活动可以在不同的任务中多次实例化。

如上表所示,"standard" 是默认模式,适用于大多数类型的活动。"singleTop" 也是许多类型活动的常见且有用的启动模式。其他模式,"singleTask""singleInstance""singleInstancePerTask"不适合大多数应用程序。它们会导致一种交互模型,该模型可能对用户不熟悉,并且与大多数其他应用程序非常不同。

无论您选择哪种启动模式,请务必在启动时以及使用返回按钮从其他活动和任务导航回活动时测试活动的可用性。

有关启动模式及其与 Intent 标志交互的更多信息,请参阅任务和返回栈

android:lockTaskMode
确定当设备在锁定任务模式下运行时,系统如何呈现此活动。

Android 可以以沉浸式、类似自助服务终端的方式运行任务,称为锁定任务模式。当系统在锁定任务模式下运行时,设备用户通常无法看到通知、访问非白名单应用,或返回主屏幕,除非主页应用在白名单中。

只有设备策略控制器 (DPC) 批准列入白名单的应用才能在系统处于锁定任务模式时运行。但是,系统和特权应用可以在不被列入白名单的情况下在锁定任务模式下运行。

该值可以是以下 R.attr.lockTaskMode 字符串值之一:

说明
"normal" 默认值。这是默认值。任务不会启动到锁定任务模式,但可以通过调用 startLockTask() 将其置于该模式。
"never"

任务不会启动到 lockTask 模式,并且设备用户无法从最近使用的应用屏幕固定这些任务。

注意:此模式仅适用于系统和特权应用程序。具有此值的非特权应用程序被视为 normal

"if_whitelisted" 如果 DPC 使用 DevicePolicyManager.setLockTaskPackages() 授权此软件包,则此模式与 always 相同,不同之处在于如果活动是最后一个锁定的任务,它需要在完成之前调用 stopLockTask()。如果 DPC 未授权此软件包,则此模式与 normal 相同。
"always"

以该活动为根的任务始终在锁定任务模式下启动。如果系统在启动此任务时已经处于锁定任务模式,则新任务将在当前任务之上启动。在此模式下启动的任务可以通过调用 finish() 退出锁定任务模式。

注意:此模式仅适用于系统和特权应用程序。具有此值的非特权应用程序被视为 normal

此属性在 API 级别 23 中引入。

android:maxRecents
最近使用的应用屏幕中以该活动为根的任务的最大数量。当达到此条目数量时,系统会从最近使用的应用屏幕中移除最近最少使用的实例。有效值是 1 到 50 之间的整数,或在低内存设备上为 1 到 25。零无效。默认值为 16。
android:maxAspectRatio

活动支持的最大宽高比。

如果应用在具有更宽宽高比的设备上运行,系统会自动将应用信箱化,使屏幕部分未被使用,以便应用可以在其指定的最大宽高比下运行。

最大宽高比表示为设备较长尺寸除以较短尺寸的商的十进制形式。例如,如果最大宽高比为 7:3,则将此属性的值设置为 2.33。

在非穿戴设备上,此属性的值必须大于或等于 1.33。在穿戴设备上,它必须大于或等于 1.0。否则,系统会忽略设置的值。

有关此属性的更多信息,请参阅R.attr.maxAspectRatio

android:minAspectRatio

活动支持的最小宽高比。

如果应用在具有较窄宽高比的设备上运行,系统会自动将应用信箱化,使屏幕部分未被使用,以便应用可以在其指定的最小宽高比下运行。

最小宽高比表示为设备较长尺寸除以较短尺寸的商的十进制形式。例如,如果显示宽高比为 4:3,则将最小宽高比值设置为 1.33。

该值必须大于或等于 1.0,否则系统会忽略设置的值。

有关此属性的更多信息,请参阅R.attr.minAspectRatio

android:multiprocess
活动实例是否可以启动到启动它的组件的进程中。如果可以,则为 "true";否则为 "false"。默认值为 "false"

通常,活动的新实例会启动到定义它的应用程序的进程中,因此活动的所有实例都在同一进程中运行。但是,如果此标志设置为 "true",则活动的实例可以在多个进程中运行,允许系统在需要它们的地方创建实例,前提是权限允许——这种情况几乎不需要或不希望出现。

android:name
实现活动的类的名称,它是 Activity 的子类。属性值通常是完全限定的类名,例如 "com.example.project.ExtracurricularActivity"。但是,作为简写,如果名称的第一个字符是句点,例如 ".ExtracurricularActivity",则会将其附加到 build.gradle 文件中指定的命名空间

发布应用程序后,请勿更改此名称,除非您将 android:exported="false"。没有默认值。必须指定名称。

android:noHistory
当用户离开活动且活动不再在屏幕上可见时,是否通过调用其 finish() 方法,将活动从活动堆栈中移除并结束。如果结束,则为"true";否则为 "false"。默认值为 "false"

值为 "true" 意味着活动不会留下历史痕迹。它不会保留在任务的活动堆栈中,因此用户无法返回到它。在这种情况下,如果您从该活动启动另一个活动以获取结果,则永远不会调用 onActivityResult()

此属性在 API 级别 3 中引入。

android:parentActivityName
活动的逻辑父类的类名。此处的名称必须与相应 <activity> 元素的 android:name 属性给出的类名匹配。

系统读取此属性以确定当用户点击操作栏中的“向上”按钮时要启动哪个活动。系统还可以使用此信息通过 TaskStackBuilder 合成活动的返回栈。

为了支持 API 级别 4 - 16,您还可以使用 <meta-data> 元素声明父活动,该元素指定 "android.support.PARENT_ACTIVITY" 的值

<activity
    android:name="com.example.app.ChildActivity"
    android:label="@string/title_child_activity"
    android:parentActivityName="com.example.app.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>

有关声明父活动以支持“向上”导航的更多信息,请阅读提供“向上”导航

此属性在 API 级别 16 中引入。

android:persistableMode

定义活动的实例如何在设备重启后在包含任务中保留。

如果任务的根活动将此属性的值设置为 persistRootOnly,则只保留根活动。否则,将检查任务返回栈中更上层的活动;任何将此属性值设置为 persistAcrossReboots 的活动都将被保留。

如果使用此属性,则必须将其值设置为以下之一:

说明
persistRootOnly

默认值。当系统重启时,活动任务会保留,但只使用根活动的启动 intent。

当您应用的启动 intent 加载您应用的根活动时,活动不会收到 PersistableBundle 对象。因此,不要使用 onSaveInstanceState() 在设备重启后保留您应用的根活动状态。

注意:此属性值仅在您应用的根活动上设置时才影响您应用的行为。

persistAcrossReboots

此活动的状态将保留,同时保留返回栈中更上层且其 persistableMode 属性设置为 persistAcrossReboots 的每个活动的状态。如果活动没有设置为 persistAcrossRebootspersistableMode 属性,或者它是使用 Intent.FLAG_ACTIVITY_NEW_DOCUMENT 标志启动的,则该活动以及返回栈中所有更上层的活动都不会保留。

当 intent 在您的应用中加载一个其 persistableMode 属性设置为 persistAcrossReboots 的活动时,该活动将在其 onCreate() 方法中收到一个 PersistableBundle 对象。因此,您可以使用 onSaveInstanceState() 在设备重启后保留活动的状态,只要其 persistableMode 属性设置为 persistAcrossReboots

注意:此属性值会影响您的应用行为,即使它设置在非应用根 Activity 的 Activity 上。

persistNever

Activity 的状态不予保留。

注意:此属性值仅在您应用的根活动上设置时才影响您应用的行为。

此属性在 API 级别 21 中引入。

android:permission
客户端启动 Activity 或使其响应 Intent 所需的权限名称。如果 startActivity()startActivityForResult() 的调用方未获得指定权限,则其 Intent 不会传递给 Activity。

如果未设置此属性,则 <application> 元素的 permission 属性所设置的权限将应用于此 Activity。如果两个属性都未设置,则此 Activity 不受任何权限保护。

有关权限的更多信息,请参阅应用清单概览的权限部分和安全提示

android:process

Activity 运行所在进程的名称。通常,应用程序的所有组件都在为该应用程序创建的默认进程名称中运行,您无需使用此属性。但如有必要,您可以使用此属性覆盖默认进程名称,从而将您的应用组件分散到多个进程中。

如果分配给此属性的名称以冒号 (:) 开头,则在需要时会创建一个应用程序私有的新进程,并且 Activity 会在该进程中运行。

如果进程名称以小写字母开头,则 Activity 会在该名称的全局进程中运行,前提是它具有这样做的权限。这使得不同应用程序中的组件可以共享一个进程,从而减少资源使用。

<application> 元素的 process 属性可以为所有组件设置不同的默认进程名称。

android:relinquishTaskIdentity

Activity 是否将其任务标识符转让给任务堆栈中位于其上方的 Activity。如果任务的根 Activity 将此属性设置为 "true",则该任务会将其基本 Intent 替换为任务中下一个 Activity 的基本 Intent

如果下一个 Activity 也将此属性设置为 "true",则它会将基本 Intent 交给它在同一任务中启动的任何 Activity。此过程会持续到遇到将此属性设置为 "false" 的 Activity 为止。默认值为 "false"

将此属性设置为 "true" 也允许 Activity 使用 ActivityManager.TaskDescription 来更改最近任务屏幕中的标签、颜色和图标。

android:requireContentUriPermissionFromCaller

指定在传递内容 URI 时启动此 Activity 所需的权限。默认值为 none,表示不需要特定权限。设置此属性会根据调用方的权限限制 Activity 调用。如果调用方没有所需的权限,Activity 启动将被拒绝,并抛出 SecurityException

请注意,此强制执行适用于 Intent.getData()Intent.EXTRA_STREAMIntent.getClipData() 中的内容 URI。

可以是字符串值,使用 '\\;' 来转义字符,例如 '\\n' 或 '\\uxxxx' 表示 Unicode 字符;

必须是以下常量值之一。

常量 说明
none 0 默认值,不需要特定权限。
read 1 强制调用方对传递的内容 URI 具有读取权限。
readAndWrite 4 强制调用方对传递的内容 URI 具有读取和写入权限。
readOrWrite 3 强制调用方对传递的内容 URI 具有读取或写入权限。
write 2 强制调用方对传递的内容 URI 具有写入权限。
android:resizeableActivity

指定应用是否支持多窗口模式

您可以在 <activity><application> 元素中设置此属性。

如果您将此属性设置为 "true",用户可以在分屏和自由形式模式下启动 Activity。如果您将此属性设置为 "false",则应用无法在多窗口环境下进行测试或优化。系统仍可以以兼容模式将 Activity 置于多窗口模式。

将此属性设置为 "false" 并不能保证屏幕上没有其他应用以多窗口模式可见,例如画中画模式或在其他显示器上。因此,设置此标志并不意味着您的应用拥有独占的资源访问权限。

如果您的应用目标 API 级别为 24 或更高,并且您未指定此属性的值,则此属性的值默认为 "true"

如果您的应用目标 API 级别为 31 或更高,则此属性在小屏幕和大屏幕上的工作方式不同

  • 大屏幕 (sw >= 600dp):所有应用都支持多窗口模式。此属性指示应用是否可以调整大小,而不是应用是否支持多窗口模式。如果 resizeableActivity="false",则在必要时会将应用置于兼容模式以适应显示尺寸。
  • 小屏幕 (sw < 600dp):如果 resizeableActivity="true" 且 Activity 的最小宽度和最小高度符合多窗口要求,则应用支持多窗口模式。如果 resizeableActivity="false",则无论 Activity 的最小宽度和高度如何,应用都不支持多窗口模式。

任务的根 Activity 值将应用于任务中启动的所有其他 Activity。也就是说,如果任务的根 Activity 可调整大小,则系统会将任务中的所有其他 Activity 视为可调整大小。如果根 Activity 不可调整大小,则任务中的其他 Activity 也不可调整大小。

注意:任务的根 Activity 值将应用于任务中启动的所有其他 Activity。也就是说,如果任务的根 Activity 可调整大小,则系统会将任务中的所有其他 Activity 视为可调整大小。如果根 Activity 不可调整大小,则任务中的其他 Activity 也不可调整大小。

android:screenOrientation

Activity 请求的方向。

当 Activity 填满整个屏幕时,请求的方向是更改该屏幕方向以匹配请求值的建议。这可能导致方向与屏幕的物理方向在空间上不同,需要用户旋转设备才能继续使用应用。在 Android 12(API 级别 31)及更高版本中,设备制造商可以配置单个设备屏幕(例如可折叠设备的平板大小屏幕)以忽略此建议,而是强制 Activity 在用户首选的设备方向内进行信箱式显示。这会导致 Activity 的方向与请求的方向匹配,而无需用户实际旋转设备。

在多窗口模式下,请求的方向不会作为整体方向的建议。如果 Activity 是信箱式显示,则请求的方向会影响应用于 Activity 的信箱式显示。

该值可以是以下字符串之一

"unspecified" 默认值。系统选择方向。其使用的策略以及在特定上下文中做出的选择可能因设备而异。
"behind" 与 Activity 堆栈中紧随其后的 Activity 的方向相同。
"landscape" 横向(显示器宽度大于高度)。
"portrait" 纵向(显示器高度大于宽度)。
"reverseLandscape" 与正常横向相反方向的横向。在 API 级别 9 中添加。
"reversePortrait" 与正常纵向相反方向的纵向。在 API 级别 9 中添加。
"sensorLandscape" 横向,但可以根据设备传感器是正常横向还是反向横向。即使用户锁定了基于传感器的旋转,传感器也会被使用。在 API 级别 9 中添加。
"sensorPortrait" 纵向,但可以根据设备传感器是正常纵向还是反向纵向。即使用户锁定了基于传感器的旋转,传感器也会被使用。但是,根据设备配置,可能不允许倒置旋转。在 API 级别 9 中添加。
"userLandscape" 横向,但可以根据设备传感器和用户偏好是正常横向还是反向横向。在 API 级别 18 中添加。
"userPortrait" 纵向,但可以根据设备传感器和用户偏好是正常纵向还是反向纵向。但是,根据设备配置,可能不允许倒置旋转。在 API 级别 18 中添加。
"sensor" 设备方向传感器决定方向。显示器的方向取决于用户握持设备的方式。当用户旋转设备时,它会改变。但是,默认情况下,有些设备不会旋转到所有四个可能的方向。要使用所有四个方向,请使用 "fullSensor"。即使用户锁定了基于传感器的旋转,传感器也会被使用。
"fullSensor" 设备方向传感器决定任何四个方向的方位。这与 "sensor" 类似,不同之处在于它允许任何四个可能的屏幕方向,无论设备通常支持什么。例如,某些设备通常不使用反向纵向或反向横向,但这会启用这些方向。在 API 级别 9 中添加。
"nosensor" 方向的确定不参考物理方向传感器。传感器被忽略,因此显示器不会根据用户移动设备的方式旋转。
"user" 用户当前的首选方向。
"fullUser" 如果用户锁定了基于传感器的旋转,则其行为与 user 相同;否则,其行为与 fullSensor 相同,并允许任何四种可能的屏幕方向。在 API 级别 18 中添加。
"locked" 将方向锁定在其当前旋转状态,无论是什么。在 API 级别 18 中添加。

注意:当您声明其中一个横向或纵向值时,它被视为 Activity 运行方向的硬性要求。您声明的值允许 Google Play 等服务进行过滤,因此您的应用程序仅适用于支持您的 Activity 所需方向的设备。例如,如果您声明 "landscape""reverseLandscape""sensorLandscape",则您的应用程序仅适用于支持横向的设备。

还应使用 <uses-feature> 元素显式声明您的应用程序需要纵向或横向,例如 <uses-feature android:name="android.hardware.screen.portrait"/>。这是 Google Play 和其他支持它的服务提供的过滤行为,平台本身不控制您的应用在设备仅支持某些方向时是否可以安装。

android:showForAllUsers

当设备的当前用户与启动 Activity 的用户不同时,是否显示 Activity。您可以将此属性设置为文字值,例如 "true""false",或者您可以将属性设置为包含布尔值的资源或主题属性。

此属性在 API 级别 23 中添加。

android:stateNotNeeded
Activity 是否可以在未保存其状态的情况下终止并成功重新启动。如果可以不参考其先前状态重新启动,则为 "true";如果需要其先前状态,则为 "false"。默认值为 "false"

通常,在 Activity 暂时关闭以节省资源之前,会调用其 onSaveInstanceState() 方法。此方法将 Activity 的当前状态存储在 Bundle 对象中,然后在 Activity 重新启动时将其传递给 onCreate()。如果此属性设置为 "true",则可能不会调用 onSaveInstanceState(),并且 onCreate() 会传入 null 而不是 Bundle,就像 Activity 首次启动时一样。

设置为 "true" 意味着 Activity 可以在没有保留状态的情况下重新启动。例如,显示主屏幕的 Activity 使用此设置来确保如果因某种原因崩溃,它不会被移除。

android:supportsPictureInPicture

指定 Activity 是否支持画中画显示。

android:taskAffinity

Activity 的任务亲和性。具有相同亲和性的 Activity 在概念上属于同一任务,从用户的角度来看属于同一“应用程序”。任务的亲和性由其根 Activity 的亲和性决定。

亲和性决定两件事:Activity 重新父化到的任务(参见 allowTaskReparenting 属性)以及当 Activity 使用 FLAG_ACTIVITY_NEW_TASK 标志启动时所处的任务。

默认情况下,应用程序中的所有 Activity 都具有相同的亲和性。您可以设置此属性以不同方式对它们进行分组,甚至将不同应用程序中定义的 Activity 放置在同一任务中。要指定 Activity 不对任何任务具有亲和性,请将其设置为空字符串。

如果未设置此属性,则 Activity 会继承为整个应用程序设置的亲和性。请参阅 <application> 元素的 taskAffinity 属性。应用程序的默认亲和性名称是 build.gradle 文件中设置的命名空间

android:theme
对定义 Activity 整体主题的样式资源的引用。这会自动将 Activity 的上下文设置为使用此 theme,并且还可能在 Activity 启动之前导致“启动”动画,以更好地匹配 Activity 的实际外观。

如果未设置此属性,Activity 将继承为整个应用程序设置的主题,来自 <application> 元素的 theme 属性。如果该属性也未设置,则使用默认系统主题。有关更多信息,请参阅样式和主题

android:uiOptions

Activity UI 的额外选项。必须是以下值之一。

说明
"none"无额外 UI 选项。这是默认值。
"splitActionBarWhenNarrow"当水平空间受限时(例如在手机的纵向模式下),在屏幕底部添加一个栏,以显示应用栏(也称为操作栏)中的操作项。应用栏不再将少量操作项显示在屏幕顶部,而是拆分为顶部的导航部分和底部的操作项栏。这意味着为操作项以及顶部的导航和标题元素提供了合理的空间。菜单项不会拆分到两个栏中。它们总是同时出现。

有关应用栏的更多信息,请参阅添加应用栏

此属性在 API 级别 14 中添加。

android:windowSoftInputMode
Activity 的主窗口如何与包含屏幕软键盘的窗口交互。此属性的设置会影响两件事
  • 当 Activity 成为用户关注焦点时,软键盘是隐藏还是可见。
  • 当窗口的一部分被软键盘覆盖时,Activity 的主窗口是缩小以腾出软键盘空间,还是其内容平移以使当前焦点可见。

设置必须是下表中列出的值之一,或者是 "state..." 值与 "adjust..." 值的组合。在任一组中设置多个值(例如多个 "state..." 值)会产生未定义的结果。单个值用竖线 (|) 分隔,如下例所示

<activity android:windowSoftInputMode="stateVisible|adjustResize" ... >

此处设置的值("stateUnspecified""adjustUnspecified" 除外)会覆盖主题中设置的值。

说明
"stateUnspecified" 未指定软键盘是隐藏还是可见。系统选择适当的状态或依赖主题中的设置。

这是软键盘行为的默认设置。

"stateUnchanged" 当 Activity 成为焦点时,软键盘保持在上次的状态,无论是可见还是隐藏。
"stateHidden" 当用户选择 Activity 时(即,当用户明确向前导航到 Activity,而不是在离开另一个 Activity 时返回到它时),软键盘被隐藏。
"stateAlwaysHidden" 当 Activity 的主窗口具有输入焦点时,软键盘始终隐藏。
"stateVisible" 当用户选择 Activity 时(即,当用户明确向前导航到 Activity,而不是在离开另一个 Activity 时返回到它时),软键盘变为可见。
"stateAlwaysVisible" 当窗口获得输入焦点时,软键盘可见。
"adjustUnspecified" Activity 的主窗口是否调整大小以腾出软键盘空间,或窗口内容是否平移以使当前焦点在屏幕上可见,均未指定。系统根据窗口内容是否包含任何可滚动其内容的布局视图自动选择其中一种模式。如果存在此类视图,窗口会调整大小,假设滚动可以在较小的区域内显示窗口的所有内容。

这是主窗口行为的默认设置。

"adjustResize" Activity 的主窗口始终调整大小以腾出屏幕上的软键盘空间。
"adjustPan" Activity 的主窗口不调整大小以腾出软键盘空间。相反,窗口内容自动平移,以便当前焦点永远不会被键盘遮挡,用户始终可以看到他们正在输入的内容。这通常不如调整大小理想,因为用户可能需要关闭软键盘才能访问和与窗口的被遮挡部分进行交互。
"adjustNothing" Activity 的主窗口不调整大小或平移以腾出软键盘空间。Activity 负责使用窗口内边距为软键盘腾出空间。对于正确处理窗口内边距的 Activity,这提供了对窗口内容如何在屏幕上显示的最大控制。

此属性在 API 级别 3 中引入。

引入于
API 级别 1,除了 noHistorywindowSoftInputMode,它们在 API 级别 3 中添加。
另请参阅
<application>
<activity-alias>