<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:enabledOnBackInvokedCallback=["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: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"

如果未设置此属性,则allowTaskReparenting的相应<application>元素属性集将应用于活动。默认值为"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 意图的活动的应用程序指定。

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

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

android:canDisplayOnRemoteDevices

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

此属性的默认值为 "true"

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

当值为 "true" 时,每次用户启动任务时,无论他们上次在任务中执行的操作是什么,以及无论他们是否使用“后退”或“主页”按钮离开任务,他们都会被带到任务的根活动。当值为 "false" 时,任务可能会在某些情况下清除活动,但并非总是如此。有关更多信息,请参阅 alwaysRetainTaskState 属性。

假设用户从主屏幕启动活动 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" 导航类型发生变化(轨迹球或方向键)。通常不会发生这种情况。
"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" 系统搜索一个任务,其基本意图的ComponentName和数据URI与启动意图的匹配。如果系统找到这样的任务,则系统会清除该任务并重新启动,根活动将收到对onNewIntent(android.content.Intent)的调用。如果系统找不到这样的任务,则系统会创建一个新任务。
"always" 即使文档已打开,活动也会为文档创建一个新任务。这与同时设置FLAG_ACTIVITY_NEW_DOCUMENTFLAG_ACTIVITY_MULTIPLE_TASK标志相同。
"none" 活动不会为活动创建新任务。这是默认值,仅当设置了FLAG_ACTIVITY_NEW_TASK时才会创建新任务。最近使用的屏幕按默认方式处理活动:它显示应用程序的单个任务,该任务从用户上次调用的任何活动恢复。
"never" 即使意图包含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 的应用程序或特权系统组件启动该活动。当没有意图过滤器时,这是默认值。

如果应用程序中的活动包含意图过滤器,请将此元素设置为"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-filter>元素的icon属性。

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

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

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

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

android:launchMode

有关活动如何启动的说明。有五种模式,它们与Intent对象中的活动标志(FLAG_ACTIVITY_*常量)一起工作,以确定何时调用活动处理意图时会发生什么。

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

默认模式为"standard"

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

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

相反,"singleTask""singleInstance""singleInstancePerTask"活动的 behavior 不同。"singleInstancePerTask"始终位于活动任务的根目录。此外,设备一次只能保存一个"singleInstance"活动的实例,而当设置FLAG_ACTIVITY_MULTIPLE_TASKFLAG_ACTIVITY_NEW_DOCUMENT时,"singleInstancePerTask"活动可以在不同的任务中多次实例化。

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

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

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

类似地,如果用户向上导航到当前堆栈上的活动,则 behavior 由父活动的启动模式决定。如果父活动具有启动模式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"活动不允许任何其他活动成为其任务的一部分。它必须是任务中唯一的活动。如果它启动另一个活动,则该活动将分配给不同的任务,就像FLAG_ACTIVITY_NEW_TASK在 intent 中一样。

用例 启动模式 多个实例? 注释
大多数活动的正常启动 "standard" 默认值。系统始终在目标任务中创建活动的新实例,并将 intent 路由到该实例。
"singleTop" 有条件地 如果活动的一个实例已存在于目标任务的顶部,则系统会通过调用其onNewIntent()方法将 intent 路由到该实例,而不是创建活动的新实例。
专门启动
(不建议一般使用)
"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 或更大。否则,系统将忽略设置的值。

注意:如果活动的resizeableActivity设置为 true,则会忽略此属性,因为这意味着您的活动支持任何尺寸。

有关此属性的更多信息,请参阅声明最大纵横比

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

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

android:name

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

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

android:noHistory
当用户从 Activity 导航离开并且它不再显示在屏幕上时,是否通过调用其 finish() 方法将其从 Activity 栈中移除并完成。如果已完成,则为 "true";如果未完成,则为 "false"。默认值为 "false"

值为 "true" 表示 Activity 不会留下历史记录。它不会保留在任务的 Activity 栈中,因此用户无法返回到它。在这种情况下,如果从该 Activity 启动另一个 Activity 以获取结果,则 onActivityResult() 永远不会被调用。

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

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

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

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

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

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

android:persistableMode

定义如何在设备重启期间在包含的任务中保留 Activity 实例。

如果任务的根 Activity 将此属性的值设置为 persistRootOnly,则仅保留根 Activity。否则,将检查任务 回退栈 中较高的 Activity;这些 Activity 中将此属性的值设置为 persistAcrossReboots 的任何 Activity 都将被保留。

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

描述
persistRootOnly

默认值。系统重启时,Activity 任务将被保留,但仅使用根 Activity 的启动 Intent。

当应用程序的启动 Intent 加载应用程序的根 Activity 时,Activity 不会接收 PersistableBundle 对象。因此,请勿使用 onSaveInstanceState() 在设备重启期间保留应用程序根 Activity 的状态。

注意:仅当在应用程序的根 Activity 上设置此属性值时,它才会影响应用程序的行为。

persistAcrossReboots

此 Activity 的状态将被保留,以及回退栈中每个较高 Activity 的状态,这些 Activity 的自己的 persistableMode 属性设置为 persistAcrossReboots。如果 Activity 没有设置为 persistAcrossRebootspersistableMode 属性,或者如果使用 Intent.FLAG_ACTIVITY_NEW_DOCUMENT 标志启动它,则该 Activity 以及回退栈中所有较高的 Activity 不会被保留。

当 Intent 加载其 persistableMode 属性在应用程序中设置为 persistAcrossReboots 的 Activity 时,Activity 会在其 onCreate() 方法中接收 PersistableBundle 对象。因此,只要其 persistableMode 属性设置为 persistAcrossReboots,就可以使用 onSaveInstanceState() 在设备重启期间保留 Activity 的状态。

注意:即使在应用程序的根 Activity 以外的 Activity 上设置此属性值,它也会影响应用程序的行为。

persistNever

Activity 的状态不会被保留。

注意:仅当在应用程序的根 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 的最小宽度和高度如何,应用都不支持多窗口模式。

注意:设备制造商可以覆盖 API 级别 31 的行为。

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

注意:任务的根 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 属性)以及当它使用 FLAG_ACTIVITY_NEW_TASK 标志启动时包含 Activity 的任务。

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

如果未设置此属性,则 Activity 将继承为应用设置的关联。请参阅 <application> 元素的 taskAffinity 属性。应用的默认关联名称是在 build.gradle 文件中设置的 命名空间

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

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

android:uiOptions

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

描述
"none"没有额外的 UI 选项。这是默认值。
"splitActionBarWhenNarrow"在水平空间受限时(例如,在手机上纵向模式下),在屏幕底部添加一个栏以显示应用栏(也称为操作栏)中的操作项。应用栏顶部不会显示少量操作项,而是将应用栏拆分为顶部导航部分和底部操作项栏。这意味着不仅为操作项提供了合理的空间,还为顶部的导航和标题元素提供了合理的空间。菜单项不会跨两个栏拆分。它们始终一起显示。

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

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

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

该设置必须是下表中列出的值之一,或是一个"state..."值加上一个"adjust..."值的组合。在任一组中设置多个值(例如多个"state..."值)会导致未定义的结果。各个值之间用竖线 (|) 分隔,如下例所示

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

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

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

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

"stateUnchanged" 当活动进入前台时,软键盘保持其最后的状态,无论是可见还是隐藏。
"stateHidden" 当用户选择活动时,软键盘会隐藏——也就是说,当用户主动向前导航到活动时,而不是在离开另一个活动时向后返回到该活动时。
"stateAlwaysHidden" 当活动的窗口获得输入焦点时,软键盘始终隐藏。
"stateVisible" 当用户选择活动时,软键盘会显示——也就是说,当用户主动向前导航到活动时,而不是在离开另一个活动时向后返回到该活动时。
"stateAlwaysVisible" 当窗口接收到输入焦点时,软键盘可见。
"adjustUnspecified" 活动的主窗口是否调整大小以腾出空间给软键盘,或者窗口内容是否平移以使当前焦点在屏幕上可见,均未指定。系统会根据窗口内容是否有任何可以滚动其内容的布局视图自动选择其中一种模式。如果存在这样的视图,则窗口会调整大小,假设滚动可以使窗口的所有内容在较小的区域内可见。

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

"adjustResize" 活动的窗口始终调整大小以在屏幕上为软键盘腾出空间。
"adjustPan" 活动的窗口不会调整大小以腾出空间给软键盘。相反,窗口的内容会自动平移,以便当前焦点永远不会被键盘遮挡,用户始终可以看到他们正在输入的内容。这通常不如调整大小理想,因为用户可能需要关闭软键盘才能访问和交互被遮挡的窗口部分。

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

引入于
API 级别 1(对于除noHistorywindowSoftInputMode之外的所有属性),这两个属性是在 API 级别 3 中添加的。
另请参阅
<application>
<activity-alias>