支持多窗口模式

多窗口模式允许多个应用同时共享同一个屏幕。应用可以并排显示或一个在上一个在下(分屏模式),一个应用以小窗口的形式覆盖其他应用(画中画模式),或者各个应用以单独的可移动、可调整大小的窗口显示(桌面窗口模式)。

图 1. 在分屏模式下并排显示两个应用。

有关如何在手机上访问分屏模式的用户说明,请访问 在 Pixel 手机上同时查看两个应用

特定版本的多分窗口功能

多窗口用户体验取决于 Android 版本和设备类型。

  • Android 7.0(API 级别 24)在小屏幕设备上引入了分屏模式,在部分设备上引入了画中画模式。

    • 分屏模式 使用两个应用填充屏幕,将它们并排显示或一个在上一个在下。用户可以拖动分隔两个应用的分隔线,使一个应用更大,另一个应用更小。

    • 画中画模式 使用户可以在与另一个应用交互时继续视频播放(参见 画中画支持)。

    • 桌面窗口模式 中,用户可以自由调整每个活动的大小,大型屏幕设备的制造商可以启用此模式。

      您可以通过指定活动的最小允许尺寸来配置您的应用如何处理多窗口模式。您还可以通过设置 resizeabableActivity="false" 来禁用应用的多窗口模式,以确保系统始终以全屏模式显示您的应用。

  • Android 8.0(API 级别 26)将画中画模式扩展到小屏幕设备。

  • Android 12(API 级别 31)使多窗口模式成为标准行为。

    • 在大屏幕上中等扩展 窗口大小类),平台支持多窗口模式下的所有应用,无论应用配置如何。如果 resizeableActivity="false",则在必要时将应用置于兼容模式以适应显示尺寸。

    • 在小屏幕上紧凑型 窗口大小类),系统会检查活动的 minWidthminHeight 以确定活动是否可以在多窗口模式下运行。如果 resizeableActivity="false",则无论最小宽度和高度如何,都将阻止应用在多窗口模式下运行。

分屏模式

用户通过执行以下操作激活分屏模式:

  1. 打开 最近使用的屏幕
  2. 向上滑动一个应用使其可见
  3. 按应用标题栏中的应用图标
  4. 选择分屏菜单选项
  5. 从最近使用的屏幕中选择另一个应用,或关闭最近使用的屏幕并运行另一个应用

用户通过将窗口分隔线拖动到屏幕边缘(向上或向下,向左或向右)来退出分屏模式。

启动相邻应用

如果您的应用需要通过意图访问内容,您可以使用 FLAG_ACTIVITY_LAUNCH_ADJACENT 在相邻的分屏窗口中打开内容。

FLAG_ACTIVITY_LAUNCH_ADJACENT 在 Android 7.0(API 级别 24)中引入,用于使在分屏模式下运行的应用能够在相邻窗口中启动活动。

Android 12L(API 级别 32)及更高版本已扩展了该标志的定义,使全屏运行的应用能够激活分屏模式,然后在相邻窗口中启动活动。

要启动相邻活动,请将 FLAG_ACTIVITY_LAUNCH_ADJACENTFLAG_ACTIVITY_NEW_TASK 结合使用,例如:

Kotlin

fun openUrlInAdjacentWindow(url:
String) { Intent(Intent.ACTION_VIEW).apply { data = Uri.parse(url)
addFlags(Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT or Intent.FLAG_ACTIVITY_NEW_TASK)
 }.also { intent -> startActivity(intent) } }

Java

public void openUrlInAdjacentWindow(String url) {
  Intent intent = new Intent(Intent.ACTION_VIEW);
  intent.setData(Uri.parse(url));
  intent.addFlags(Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT | Intent.FLAG_ACTIVITY_NEW_TASK);
  startActivity(intent);
}

多窗口模式下的活动生命周期

多窗口模式不会更改 活动生命周期。但是,在不同版本的 Android 上,多个窗口中应用的恢复状态有所不同。

多恢复

Android 10(API 级别 29)及更高版本支持多恢复——当设备处于多窗口模式时,所有活动都保持在 RESUMED 状态。如果透明活动位于活动之上或活动不可聚焦(例如,活动处于 画中画模式),则活动可能会被暂停。也可能在给定时间没有任何活动具有焦点,例如,如果通知抽屉已打开。onStop() 方法照常工作:只要活动被移出屏幕,就会调用该方法。

在运行 Android 9(API 级别 28)的部分设备上也可以使用多恢复。要在 Android 9 设备上选择加入多恢复,请添加以下清单元数据:

<meta-data android:name="android.allow_multiple_resumed_activities" android:value="true" />

要验证给定设备是否支持此清单元数据,请参考设备规格。

Android 9

在 Android 9(API 级别 28)及更低版本的多窗口模式下,在给定时间内,只有用户最近交互过的活动才是活动的。此活动被认为是最顶层的,并且是唯一处于 RESUMED 状态的活动。所有其他可见活动都处于 STARTED 状态,但并非处于 RESUMED 状态。但是,系统会给这些可见但未恢复的活动比不可见的活动更高的优先级。如果用户与其中一个可见活动进行交互,则该活动将被恢复,而先前最顶层的活动将进入 STARTED 状态。

当单个活动应用进程中存在多个活动时,z 顺序最高的活动将被恢复,而其他活动将被暂停。

配置更改

当用户将应用置于多窗口模式时,系统会根据 处理配置更改 中指定的配置更改通知活动。当用户调整应用大小或将应用恢复到全屏模式时,也会发生这种情况。

从本质上讲,此更改与系统通知应用设备已从纵向切换到横向时的活动生命周期含义相同,只是应用尺寸已更改,而不仅仅是交换。您的活动可以自行处理配置更改,或者您的应用可以允许系统销毁活动并使用新尺寸重新创建它。

如果用户正在调整窗口大小并在任一尺寸上使其变大,则系统会调整活动的大小以匹配用户操作,并根据需要发出配置更改。如果应用在绘制新公开区域方面滞后,则系统会使用 windowBackground 属性或默认 windowBackgroundFallback 样式属性指定的颜色临时填充这些区域。

独占资源访问

为了帮助支持多恢复功能,请使用 onTopResumedActivityChanged() 生命周期回调。

当活动获得或失去顶级已恢复活动位置时,将调用回调函数。当活动使用共享单例资源(例如麦克风或摄像头)时,这一点非常重要。

Kotlin

override fun
onTopResumedActivityChanged(topResumed: Boolean) { if (topResumed) { // Top
resumed activity. // Can be a signal to re-acquire exclusive resources. } else {
// No longer the top resumed activity. } }

Java

@Override
public void onTopResumedActivityChanged(boolean topResumed) {
  if (topResumed) {
      // Top resumed activity.
      // Can be a signal to re-acquire exclusive resources.
  } else {
      // No longer the top resumed activity.
  }
}

请注意,应用程序可能会由于其他原因(例如移除共享硬件)而丢失资源。

无论如何,应用程序都应该优雅地处理影响可用资源的事件和状态更改。

对于使用摄像头的应用程序,CameraManager.AvailabilityCallback#onCameraAccessPrioritiesChanged() 提供了一个提示,表明现在可能是尝试访问摄像头的合适时机。此方法自 Android 10(API 级别 29)起可用。

请记住,resizeableActivity=false 并不能保证独占摄像头访问权限,因为其他使用摄像头的应用程序可以在其他显示屏上打开。

图 2. 多窗口模式下的摄像头。

您的应用程序不必在失去焦点时释放摄像头。例如,您可能希望在用户与新获得焦点的最顶层已恢复应用程序交互时继续进行摄像头预览。当您的应用程序不是最顶层已恢复应用程序时,它可以继续运行摄像头,但这必须正确处理断开连接的情况。当最顶层已恢复应用程序想要使用摄像头时,它可以打开摄像头,而您的应用程序将失去访问权限。您的应用程序可以在应用程序重新获得焦点时重新打开摄像头。

在应用程序接收到 CameraDevice.StateCallback#onDisconnected() 回调后,对摄像机设备的后续调用将抛出 CameraAccessException

多显示屏

Android 10(API 级别 29)支持在辅助显示屏上运行活动。如果活动在一个具有多个显示屏的设备上运行,用户可以将活动从一个显示屏移动到另一个显示屏。多恢复 也适用于多屏幕场景;多个活动可以同时接收用户输入。

应用程序可以在启动时或创建另一个活动时指定它应该在哪个显示屏上运行。此行为取决于清单文件中定义的活动启动模式,以及启动活动的主体设置的意图标志和选项。有关更多详细信息,请参阅 ActivityOptions 类。

当活动移动到辅助显示屏时,它可能会经历上下文更新、窗口大小调整以及配置和资源更改。如果活动处理配置更改,则会在 onConfigurationChanged() 中通知活动;否则,活动将重新启动。

如果处理配置更改,活动应在 onCreate()onConfigurationChanged() 中检查当前显示屏。确保在显示屏更改时更新资源和布局。

如果活动的选定启动模式允许多个实例,则在辅助屏幕上启动可能会创建活动的新的实例。这两个活动将同时恢复。

图 3. 多个显示屏上的多个活动实例。

您可能还想阅读有关 Android 8.0 中引入的 多显示屏 API 的信息。

活动上下文与应用程序上下文

在多显示屏环境中使用正确的上下文至关重要。访问资源时,活动上下文(已显示)与应用程序上下文(未显示)不同。

活动上下文包含有关显示屏的信息,并且始终针对活动显示的显示区域进行调整。这使您能够获取有关应用程序的显示屏密度或窗口指标的正确信息。您应该始终使用活动上下文(或其他基于 UI 的上下文)来获取有关当前窗口或显示屏的信息。这还会影响使用上下文信息的一些系统 API(例如,请参阅 Toast 概述)。

活动窗口配置和父显示屏定义资源和上下文。获取当前显示屏的方法如下:

Kotlin

val activityDisplay = activity.getDisplay()

Java

Display activityDisplay = activity.getDisplay();

获取当前活动窗口指标

Kotlin

val windowMetrics = activity.getWindowManager().getCurrentWindowMetrics()

Java

WindowMetrics windowMetrics = activity.getWindowManager().getCurrentWindowMetrics();

获取当前系统配置的最大窗口指标

Kotlin

val maximumWindowMetrics = activity.getWindowManager().getMaximumWindowMetrics()

Java

WindowMetrics maximumWindowMetrics = activity.getWindowManager().getMaximumWindowMetrics();

最大窗口指标用于进行计算、布局选择或确定提前获取资源的大小。在 onCreate() 中提供此信息,使您能够在第一次布局传递之前做出这些决定。这些指标不应用于布局特定的视图元素;而应使用 Configuration 对象中的信息。

显示屏挖孔

可折叠设备在折叠和展开时的挖孔几何形状可能不同。要避免挖孔问题,请参阅 支持显示屏挖孔

辅助显示屏

您可以从 DisplayManager 系统服务中获取可用的显示屏。

Kotlin

val displayManager =
getSystemService(Context.DISPLAY_SERVICE) as DisplayManager val displays =
displayManager.getDisplays()

Java

DisplayManager displayManager = (DisplayManager) getSystemService(Context.DISPLAY_SERVICE);
Display[] displays = displayManager.getDisplays();

使用 Display 类获取有关特定显示屏的信息,例如显示屏大小或指示显示屏是否安全的 标志。但是,不要假设显示屏大小将与分配给您的应用程序的显示区域相同。请记住,在多窗口模式下,您的应用程序占据显示屏的一部分。

确定活动是否可以在显示屏上启动

Kotlin

val activityManager =
getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager val
activityAllowed = activityManager.isActivityStartAllowedOnDisplay(context,
displayId, intent)

Java

ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
boolean activityAllowed = activityManager.isActivityStartAllowedOnDisplay(context, displayId, intent);

然后在显示屏上启动活动

Kotlin

val options = ActivityOptions.makeBasic()
options.setLaunchDisplayId(targetDisplay.displayId) startActivity(intent,
options.toBundle())

Java

ActivityOptions options = ActivityOptions.makeBasic();
options.setLaunchDisplayId(targetDisplay.displayId);
startActivity(intent, options.toBundle());

多显示屏支持

Android 为软件键盘、壁纸和启动器提供多显示屏支持。

软件键盘

如果显示屏配置为支持系统装饰,则可以在辅助屏幕上显示键盘。如果文本字段在该显示屏上请求输入,则输入法编辑器会自动出现。

图 4. 辅助显示屏上的键盘。

壁纸

在 Android 10(API 级别 29)中,辅助屏幕可以有壁纸。框架为每个显示屏创建 WallpaperService.Engine 的单独实例。确保每个引擎的表面独立绘制。开发人员可以使用 WallpaperService.Engine#getDisplayContext() 中的显示上下文加载资源。此外,请确保您的 WallpaperInfo.xml 文件设置 android:supportsMultipleDisplays="true"

图 5. 手机和辅助显示屏上的壁纸。

启动器

新的意图过滤器类别 SECONDARY_HOME 为辅助屏幕提供了一个专用的活动。活动的实例用于所有支持系统装饰的显示屏,每个显示屏一个。

<activity>
    ...
    <intent-filter>
        <category android:name="android.intent.category.SECONDARY_HOME" />
        ...
    </intent-filter>
</activity>

活动必须具有不阻止多个实例并且可以适应不同屏幕尺寸的启动模式。启动模式不能是 singleInstancesingleTask

例如,Launcher3 的 AOSP 实现支持 SECONDARY_HOME 活动。

图 6. 手机上的 Material Design 启动器。
图 7. 辅助显示屏上的 Material Design 启动器。

窗口指标

Android 11(API 级别 30)引入了以下 WindowManager 方法,以提供在多窗口模式下运行的应用程序的边界

Jetpack WindowManager 库方法 computeCurrentWindowMetrics()computeMaximumWindowMetrics() 分别提供了类似的功能,但具有对 API 级别 14 的向后兼容性。

要获取除当前显示屏之外的显示屏的指标,请执行以下操作(如代码片段所示):

  • 创建显示上下文
  • 为显示屏创建窗口上下文
  • 获取窗口上下文的 WindowManager
  • 获取应用程序可用的最大显示区域的 WindowMetrics

Kotlin

val windowMetrics =
context.createDisplayContext(display)
.createWindowContext(WindowManager.LayoutParams.TYPE_APPLICATION, null)
.getSystemService(WindowManager::class.java) .maximumWindowMetrics

Java

WindowMetrics windowMetrics = context.createDisplayContext(display)
                            .createWindowContext(WindowManager.LayoutParams.TYPE_APPLICATION, null)
                            .getSystemService(WindowManager.class)
                            .getMaximumWindowMetrics();

已弃用的方法

Display 方法 getSize()getMetrics() 在 API 级别 30 中已弃用,取而代之的是新的 WindowManager 方法。

Android 12(API 级别 31)弃用 Display 方法 getRealSize()getRealMetrics() 并更新其行为,使其更接近于 getMaximumWindowMetrics() 的行为。

多窗口模式配置

如果您的应用程序面向 Android 7.0(API 级别 24)或更高版本,您可以配置应用程序的活动如何以及是否支持多窗口模式。您可以在清单文件中设置属性来控制大小和布局。根活动的属性设置应用于其任务堆栈中的所有活动。例如,如果根活动具有 android:resizeableActivity="true",则任务堆栈中的所有活动都是可调整大小的。在某些较大的设备(例如 Chromebook)上,即使您指定 android:resizeableActivity="false",您的应用程序也可能在可调整大小的窗口中运行。如果这会破坏您的应用程序,您可以使用 Google Play 上的过滤器 来限制您的应用程序在此类设备上的可用性。

Android 12(API 级别 31)默认为多窗口模式。在大屏幕(中等扩展 窗口大小类)上,所有应用程序都在多窗口模式下运行,无论应用程序配置如何。在小屏幕上,系统会检查活动的 minWidthminHeightresizeableActivity 设置,以确定活动是否可以在多窗口模式下运行。

resizeableActivity

在清单文件的<activity><application>元素中设置此属性,以启用或禁用API级别30及以下的多窗口模式。

<application
  android:name=".MyActivity"
  android:resizeableActivity=["true" | "false"] />;

如果此属性设置为true,则可以在分屏和桌面窗口模式下启动活动。如果属性设置为false,则活动不支持多窗口模式。如果值为false,并且用户尝试在多窗口模式下启动活动,则活动将占据全屏。

如果您的应用面向API级别24或更高版本,但未指定此属性的值,则属性的值默认为true。

如果您的应用面向API级别31或更高版本,则此属性在小屏幕和大屏幕上的工作方式有所不同。

  • 大屏幕中等扩展窗口尺寸类别):所有应用都支持多窗口模式。此属性指示活动是否可以调整大小。如果resizeableActivity="false",则应用程序在必要时将进入兼容模式以符合显示尺寸。
  • 小屏幕紧凑窗口尺寸类别):如果resizeableActivity="true"并且活动的最小宽度和最小高度在多窗口要求范围内,则活动支持多窗口模式。如果resizeableActivity="false",则无论活动的最小宽度和高度如何,活动都不支持多窗口模式。

supportsPictureInPicture

在清单文件的<activity>节点中设置此属性,以指示活动是否支持画中画模式。

<activity
  android:name=".MyActivity"
  android:supportsPictureInPicture=["true" | "false"] />

configChanges

要自己处理多窗口配置更改(例如,当用户调整窗口大小时),请将android:configChanges属性添加到您的应用清单<activity>节点中,至少包含以下值:

<activity
  android:name=".MyActivity"
  android:configChanges="screenSize | smallestScreenSize
      | screenLayout | orientation" />

添加android:configChanges后,您的活动和片段将收到对onConfigurationChanged()的回调,而不是被销毁和重新创建。然后,您可以根据需要手动更新视图、重新加载资源并执行其他操作。

<layout>

在Android 7.0(API级别24)及更高版本上,<layout>清单元素支持几个影响活动在多窗口模式下行为的属性。

  • android:defaultHeightandroid:defaultWidth:在桌面窗口模式下启动活动时的默认高度和宽度。

  • android:gravity:在桌面窗口模式下启动活动时的初始位置。请参阅Gravity类以了解合适的数值。

  • android:minHeightandroid:minWidth:活动在分屏和桌面窗口模式下的最小高度和最小宽度。如果用户在分屏模式下移动分隔线以使活动小于指定的最小值,则系统会将活动裁剪到用户请求的大小。

以下代码显示了如何在活动以桌面窗口模式显示时指定活动默认大小和位置以及最小大小。

<activity android:name=".MyActivity">
    <layout android:defaultHeight="500dp"
          android:defaultWidth="600dp"
          android:gravity="top|end|..."
          android:minHeight="450dp"
          android:minWidth="300dp" />
</activity>

运行时的多窗口模式

从Android 7.0开始,系统提供了支持可在多窗口模式下运行的应用程序的功能。

多窗口模式下禁用的功能

在多窗口模式下,Android可能会禁用或忽略不适用于与其他活动或应用程序共享设备屏幕的活动的特性。

此外,某些系统UI自定义选项也被禁用。例如,如果应用程序在多窗口模式下运行,则无法隐藏状态栏(请参阅控制系统UI可见性)。

系统会忽略对android:screenOrientation属性的更改。

多窗口模式查询和回调

Activity类提供了以下方法来支持多窗口模式。

  • isInMultiWindowMode():指示活动是否处于多窗口模式。

  • isInPictureInPictureMode():指示活动是否处于画中画模式。

  • onMultiWindowModeChanged():每当活动进入或退出多窗口模式时,系统都会调用此方法。如果活动正在进入多窗口模式,则系统会向方法传递true值;如果活动正在离开多窗口模式,则系统会传递false值。

  • onPictureInPictureModeChanged():每当活动进入或退出画中画模式时,系统都会调用此方法。如果活动正在进入画中画模式,则系统会向方法传递true值;如果活动正在离开画中画模式,则系统会传递false值。

Fragment类公开了许多这些方法的版本;例如,Fragment.onMultiWindowModeChanged()

画中画模式

要将活动置于画中画模式,请调用enterPictureInPictureMode()。如果设备不支持画中画模式,则此方法无效。有关更多信息,请参阅使用画中画 (PiP) 添加视频

多窗口模式下的新活动

启动新活动时,您可以指示新活动应尽可能显示在当前活动旁边。使用意图标志FLAG_ACTIVITY_LAUNCH_ADJACENT,它告诉系统尝试在新窗口中创建新活动,以便两个活动共享屏幕。系统会尽力做到这一点,但这并非保证一定能实现。

如果设备处于桌面窗口模式并且您要启动新活动,则可以通过调用ActivityOptions.setLaunchBounds()来指定新活动的大小和屏幕位置。如果设备未处于多窗口模式,则此方法无效。

在API级别30及以下版本中,如果在任务堆栈中启动活动,则活动将替换屏幕上的活动,并继承其所有多窗口属性。如果要在多窗口模式下将新活动作为单独的窗口启动,则必须在新任务堆栈中启动它。

Android 12(API级别31)使应用程序能够在多个活动之间分割应用程序的任务窗口。您可以通过创建XML配置文件或进行Jetpack WindowManager API调用来确定您的应用程序如何显示其活动——全屏、并排或堆叠。

拖放

当两个活动共享屏幕时,用户可以将数据从一个活动拖放到另一个活动。(在Android 7.0之前,用户只能在一个活动内拖放数据。)要快速添加对接受已删除内容的支持,请参阅DropHelper API。有关全面的拖放指南,请参阅启用拖放

多实例

每个根活动都有其自己的任务,该任务在单独的进程上运行,并在其自己的窗口中显示。要在单独的窗口中启动应用程序的新实例,您可以使用FLAG_ACTIVITY_NEW_TASK标志启动新活动。您可以将此与一些多窗口属性结合使用,以请求新窗口的特定位置。例如,购物应用程序可以显示多个窗口来比较产品。

Android 12(API级别31)使您可以并排在同一任务窗口中启动活动的两个实例。

如果要允许用户从应用程序启动器或任务栏启动应用程序的另一个实例,请确保您的启动器活动设置android:resizeableActivity="true"并且不使用阻止多个实例的启动模式。例如,当设置了FLAG_ACTIVITY_MULTIPLE_TASKFLAG_ACTIVITY_NEW_DOCUMENT时,singleInstancePerTask活动可以在不同的任务中多次实例化。

不要将多实例与多面板布局混淆,例如使用SlidingPaneLayout列表-详细信息演示,它在一个窗口内运行。

请注意,当多个实例在可折叠设备上的单独窗口中运行时,如果姿势发生变化,一个或多个实例可能会被发送到后台。例如,假设设备展开,并且在折叠的两侧的两个窗口中运行两个应用程序实例。如果设备折叠,则其中一个实例可能会被终止,而不是尝试将两个实例的窗口都适应较小的屏幕。

多窗口模式验证

无论您的应用是否面向API级别24或更高版本,您都应该验证它在多窗口模式下的行为,以防用户尝试在运行Android 7.0或更高版本的设备上以多窗口模式启动它。

测试设备

运行Android 7.0(API级别24)或更高版本的设备支持多窗口模式。

API级别23或更低版本

当用户尝试在多窗口模式下使用应用程序时,除非应用程序声明固定方向,否则系统会强制调整应用程序大小。

如果您的应用程序未声明固定方向,则应在运行Android 7.0或更高版本的设备上启动您的应用程序,并尝试将其置于分屏模式。验证应用程序被强制调整大小时用户体验是否可接受。

如果应用声明了固定方向,则应尝试将其置于多窗口模式。验证这样做时,应用是否保持全屏模式。

API 级别 24 至 30

如果您的应用面向 API 级别 24 至 30 且未禁用多窗口支持,请在分屏模式和桌面窗口模式下验证以下行为

  • 以全屏模式启动应用,然后通过长按**最近使用的应用**按钮切换到多窗口模式。验证应用是否正确切换。

  • 直接在多窗口模式下启动应用,并验证应用是否正确启动。您可以通过按下**最近使用的应用**按钮,然后长按应用标题栏并将其拖动到屏幕上的突出显示区域之一来在多窗口模式下启动应用。

  • 通过拖动屏幕分隔线来调整分屏模式下应用的大小。验证应用是否不会崩溃,并且必要的 UI 元素是否可见。

  • 如果您已为应用指定了最小尺寸,请尝试调整应用大小,使其窗口尺寸小于这些尺寸。验证您是否无法将应用大小调整为小于指定的最小尺寸。

  • 在所有测试中,验证应用的性能是否可接受。例如,验证调整应用大小后更新 UI 是否没有太长的延迟。

API 级别 31 或更高

如果您的应用面向 API 级别 31 或更高,并且主活动的最小宽度和最小高度小于或等于可用显示区域的相应尺寸,请验证为API 级别 24 至 30列出的所有行为。

测试清单

要验证您的应用在多窗口模式下的性能,请尝试以下操作。除非另有说明,否则您应该在分屏模式和桌面窗口模式下尝试这些操作。

  • 进入和退出多窗口模式。

  • 从您的应用切换到另一个应用,并验证应用在可见但未处于活动状态时的行为是否正确。例如,如果您的应用正在播放视频,请验证用户与另一个应用交互时视频是否继续播放。

  • 在分屏模式下,尝试移动屏幕分隔线以使您的应用变大变小。尝试在并排和上下两种配置中进行这些操作。验证应用不会崩溃,基本功能可见,并且调整大小操作不会花费太长时间。

  • 快速连续执行几次调整大小操作。验证您的应用不会崩溃或内存泄漏。Android Studio 的内存分析器提供有关应用内存使用情况的信息(请参阅使用内存分析器检查应用的内存使用情况)。

  • 在许多不同的窗口配置中正常使用您的应用,并验证应用的行为是否正确。验证文本是否可读,以及 UI 元素是否不会太小而无法交互。

禁用多窗口支持

在 API 级别 24 至 30 上,如果您通过设置android:resizeableActivity="false"禁用了多窗口支持,则应在运行 Android 7.0 至 11 的设备上启动您的应用,并尝试将应用置于分屏模式和桌面窗口模式。验证这样做时,应用是否保持全屏模式。

其他资源

有关 Android 中多窗口支持的更多信息,请参阅

为您推荐 * 注意:当 JavaScript 关闭时显示链接文本 * 设备兼容性模式 * 支持大屏幕可调整大小 * 处理配置更改