多視窗模式支援

Android 支援多個應用程式同時共用同一個畫面。系統可並排顯示兩個應用程式 (分割畫面模式),將一個應用程式放在小型視窗中並重疊在其他應用程式之上 (子母畫面模式),或在單獨的可移動、可調整大小的視窗中放置每個應用程式 (任意形式模式)。

在分割畫面模式中,兩個應用程式並排執行。

圖 1. 在分割畫面模式中,兩個應用程式並排執行。

使用者體驗取決於 Android 作業系統的版本和裝置類型:

  • 搭載 Android 7.0 的手持裝置可使用分割畫面模式,電視上則可使用子母畫面。

    分割畫面模式會將兩個應用程式填滿螢幕,左右或上下並排顯示。使用者可以拖曳分隔兩個應用程式的分隔線,將一個應用程式放大,另一個縮小。

    子母畫面模式可讓使用者一邊與其他應用程式互動,一邊播放影片 (請參閱子母畫面支援)。

    大型裝置的製造商可選擇啟用任意形式模式,讓使用者可以自由調整每個活動的大小。

    您可以指定活動的最小允許尺寸,藉此設定應用程式處理多視窗顯示的方式。您也可以設定 resizeableActivity="false",停用應用程式的多視窗顯示功能,確保系統一律會以全螢幕顯示應用程式。

  • Android 8.0 將子母畫面模式擴充到了手持裝置。
  • Android 12 將多視窗模式設為標準行為。

    在大螢幕上 (sw >= 600dp),無論應用程式設定為何,平台都支援所有應用程式採用多視窗模式。如果設為 resizeableActivity="false",應用程式會在必要時處於相容模式,以符合顯示尺寸。

    在小螢幕上 (sw < 600dp),系統會檢查活動的 minWidthminHeight,判斷該活動是否能以多視窗模式執行。如果設為 resizeableActivity="false",則無論最小寬度和高度如何,該應用程式都無法以多視窗模式執行。

    注意:裝置製造商可覆寫這些行為。

分割畫面模式啟用

使用者可以按照下列步驟啟用分割畫面模式:

  1. 開啟「最近使用」畫面
  2. 將應用程式滑動到檢視區塊
  3. 按下應用程式標題列中的應用程式圖示
  4. 選取「分割畫面」選單選項
  5. 從「最近使用」畫面選取另一個應用程式,或關閉「最近使用」畫面並執行另一個應用程式

使用者可以將視窗分隔線拖曳至任一方向的螢幕邊緣,從而退出分割畫面模式。

多視窗模式生命週期

多視窗模式不會改變活動生命週期。但是,多個視窗中應用程式的重新啟用狀態會因 Android 版本而異。

多視窗運作

在 Android 10 (API 級別 29) 及以上版本中,當裝置處於多視窗模式時,所有活動都會維持在 RESUMED 狀態。這稱為多視窗運作。請注意,如果頂端有透明活動,或是活動無法聚焦 (例如子母畫面模式),系統就會暫停活動。也有可能在某個時間點,所有活動都沒有聚焦,例如當通知匣開啟時。onStop 方法可照常運作;每當有活動從畫面中消失時,就會呼叫此方法。

搭載 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 順序最高的活動,然後暫停其他活動。

注意:在 Android 9 及以下版本的多視窗模式下,即使使用者能夠看到應用程式,應用程式也可能不會處於 RESUMED 狀態,但當應用程式不位於最上層時,其可能仍需要繼續作業。例如,處於該狀態的影片應用程式應繼續播放影片。出於此原因,我們建議播放影片的活動不會為因應 ON_PAUSE 生命週期事件而暫停播放影片。而應改為因應 ON_START 而開始播放,並因應 ON_STOP 而暫停播放。如果您直接處理生命週期事件,而非使用 Lifecycle 套件,請在 onStop() 處理常式中暫停播放影片,並在 onStart() 中恢復播放。

設定變更

當使用者將應用程式置於多視窗模式時,系統會通知活動發生了設定變更 (如處理設定變更中所述)。當使用者調整應用程式大小或將應用程式重新置於全螢幕模式時,也會發生此操作。

當裝置從直向切換為橫向時,系統會通知應用程式,從本質上來講,這項變更對活動生命週期的影響與此相同,不同的是前者是改變方向,後者是改變尺寸。如處理設定變更所述,您的活動可以自行處理設定變更,也可以允許系統刪除活動,並使用新的尺寸重新建立活動。

如果使用者調整視窗大小,並增加某個方向上的尺寸,系統會配合使用者動作調整活動大小,並視需要發佈設定變更。如果應用程式未能及時使用內容填充擴大的區域,系統會臨時為這些區域填入 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() 中通知活動,否則將重新啟動活動。

如果活動處理了設定變更,則應在 onCreateonConfigurationChanged 中檢查當前的螢幕。請務必在螢幕變更時更新資源和版面配置。

如果為活動選取的啟動模式允許多個執行個體,則在第二螢幕中啟動活動時,會建立活動的新執行個體。這兩個活動將同時重新啟用。

一個活動在多個螢幕上的多個執行個體。

圖 3. 一個活動在多個螢幕上的多個執行個體。

建議您還參閱 Android 8.0 中引入的多重顯示 API。

活動與應用程式背景

使用適當的背景對多重顯示至關重要。存取資源時,活動背景 (目前顯示) 與應用程式背景 (目前未顯示) 不同。

活動背景包含螢幕的相關資訊,且會始終隨著該活動顯示的螢幕區域而進行調整。這讓您能夠獲得有關應用程式目前螢幕密度或視窗指標的正確資訊。您應始終使用活動背景 (或其他以 UI 為基礎的背景) 來取得目前視窗或螢幕的相關資訊。這也會影響部分使用背景資訊的系統 API (例如,請參閱浮動式訊息總覽)。

活動視窗設定和父項螢幕定義了資源和背景。按以下方式取得目前的螢幕:

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 的 Android 開放原始碼計畫實作支援 SECONDARY_HOME 活動。

手機上的質感設計啟動器。

圖 6. 手機上的質感設計啟動器。

第二螢幕上的質感設計啟動器。

圖 7. 第二螢幕上的質感設計啟動器。

視窗指標

Android 11 (API 級別 30) 推出了下列 WindowManager 方法,為在多視窗模式下執行的應用程式提供邊界:

Jetpack WindowManager 程式庫方法 computeCurrentWindowMetrics()computeMaximumWindowMetrics() 分別提供類似的功能,但可提供回溯至 API 級別 14 的相容性。

已淘汰的方法

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",應用程式仍可能在可調整大小的視窗中執行。如果這種做法會中斷您的應用程式,可使用篩選器來限制應用程式在這類裝置上的可用性。

注意:如果您建構的多方向應用程式以 API 級別 23 或以下版本為目標版本,當使用者使用多視窗模式時,系統會強制調整應用程式的大小。系統會顯示一個對話方塊,警告使用者應用程式可能不會按預期運作。系統不會調整定向應用程式的大小;如果使用者嘗試使用多視窗模式開啟定向應用程式,該應用程式會佔滿整個螢幕畫面。

Android 12 (API 級別 31) 預設為多視窗模式。在大螢幕上 (sw >= 600dp),無論應用程式設定為何,所有應用程式都將以多視窗模式執行。在小螢幕上,系統會檢查活動的 minWidthminHeightresizeableActivity 設定,以判斷活動能否在多視窗模式中執行。

resizeableActivity

在資訊清單的 <activity><application> 元素中設定這個屬性,為 API 級別 30 及以下版本啟用或停用多視窗模式顯示:

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

如果此屬性設為 True,則可以在分割畫面和任意形式模式下啟動活動。如果屬性設為 False,則活動不支援多視窗模式。如果這個值為 False,而使用者嘗試在多視窗模式下啟動活動,則活動會佔滿整個螢幕畫面。

如果應用程式目標版本為 API 級別 24 或以上版本,但未指定這個屬性的值,則屬性值會預設為 True。

如果應用程式目標版本為 API 級別 31 或以上版本,則這個屬性在小螢幕和大螢幕上的運作方式會有所不同:

  • 大螢幕 (sw >= 600dp):所有應用程式皆支援多視窗模式。這個屬性會表明是否可調整活動大小。設為 resizeableActivity="false" 時,應用程式會在必要時處於相容模式,以符合顯示尺寸。
  • 小螢幕 (sw < 600dp):如果 resizeableActivity="true" 和活動的最低寬度與最低高度皆符合多視窗模式需求,則活動支援多視窗模式。如果設為 resizeableActivity="false",則無論活動的最小寬度和高度如何,該活動都不支援多視窗模式。

supportsPictureInPicture

在資訊清單的 <activity> 節點中設定這個屬性,以表明活動是否支援子母畫面模式。

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

注意:如果設為 supportsPictureInPicture="true",則必須設定 android:configChanges 屬性,才能讓活動處理設定變更 (請參閱子母畫面支援)。

configChanges

如要自行處理多視窗設定變更 (例如當使用者調整視窗大小時),請將 android:configChanges 屬性加入應用程式資訊清單 <activity> 節點,並至少具有以下值:

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

新增 android:configChanges 後,您的活動和片段就會收到對 onConfigurationChanged() 的回呼,而不是被刪除然後再重新建立。接著,您可以手動更新檢視畫面、重新載入資源,並視需要執行其他作業。

<layout>

在 Android 7.0 中,<layout> 資訊清單元素支援多種屬性,這些屬性會影響活動在多視窗模式下的行為:

android:defaultWidth
以任意形式模式啟動時,活動的預設寬度。
android:defaultHeight
以任意形式模式啟動時,活動的預設高度。
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()
用於表明活動是否處於子母畫面模式。
注意:子母畫面模式是一種特殊的多視窗模式。如果 myActivity.isInPictureInPictureMode() 傳回 True,則 myActivity.isInMultiWindowMode() 也會傳回 True。
onMultiWindowModeChanged()
每當活動進入或退出多視窗模式時,系統會呼叫這個方法。如果活動進入多視窗模式,系統會向該方法傳遞值 True;如果活動退出多視窗模式,則會傳遞值 False。
onPictureInPictureModeChanged()
每當活動進入或退出子母畫面模式時,系統會呼叫這個方法。如果活動進入子母畫面模式,系統會向該方法傳遞值 True;如果活動退出子母畫面模式,則會傳遞值 False。

對於上述的許多方法,Fragment 類別公開了多個版本,例如 Fragment.onMultiWindowModeChanged()

子母畫面模式

如要將活動置於子母畫面模式,請呼叫 enterPictureInPictureMode()。如果裝置不支援子母畫面模式,這個方法就不會生效。詳情請參閱子母畫面支援

多視窗模式中的新活動

如有可能,啟動新活動時,您可以指出新活動應顯示在目前活動旁邊。使用意圖旗標 FLAG_ACTIVITY_LAUNCH_ADJACENT,告知系統嘗試在鄰近視窗中建立新活動,讓兩個活動共用畫面。系統會盡力做到這一點,但並不保證一定能夠實現。

如果裝置處於任意形式模式,當您啟動新活動時,可透過呼叫 ActivityOptions.setLaunchBounds(),指定新活動的大小和螢幕位置。如果裝置不處於多視窗模式,這個方法就不會生效。

在 API 級別 30 及以下版本中,如果您在工作堆疊中啟動活動,該活動會取代螢幕上的活動,並沿用所有多視窗屬性。如要在多視窗模式下以獨立視窗啟動新活動,則必須在新的工作堆疊中啟動新活動。

Android 12 (API 級別 31) 允許應用程式在多個活動之間拆分應用程式的工作視窗。您可以建立 XML 設定檔或執行 Jetpack WindowManager API 呼叫,來決定應用程式活動的顯示方式 (全螢幕、並排或堆疊)。

拖曳

當兩個活動共用螢幕時,使用者可以將一個活動的資料拖曳到另一個活動。(在 Android 7.0 之前,使用者只能在單個活動內拖曳資料)。如要快速支援接受拖曳的內容,請參閱 DropHelper。如需完整的拖曳支援 (例如允許從應用程式拖曳內容),請按照完整的拖曳指南操作。

多執行個體

每個根活動都有自己的工作,這項工作會以獨立程序執行,並顯示在自己的視窗中。如要在單獨視窗中啟動應用程式的新執行個體,則可以使用 FLAG_ACTIVITY_NEW_TASK 旗標來啟動新活動。您可以將該旗標與部分多視窗屬性結合使用,來要求新視窗的具體位置。例如,購物應用程式可以顯示多個視窗來比較產品。

Android 12 (API 級別 31) 可讓您在同一工作視窗中並列啟動兩個活動執行個體。

請勿將多執行個體與多面板版面配置 (例如使用 SlidingPaneLayout 的清單/詳細資料版面配置) 混淆,這些版面配置在單一視窗內執行。

請注意,在折疊式裝置上的單獨視窗中執行多個執行個體時,如果裝置的擺放姿態改變,系統可能會將一或多個執行個體安排至背景中。例如,假設裝置展開,在折疊兩側的兩個視窗中各有一個應用程式執行個體正在執行。那麼當裝置折疊時,系統可能會終止其中一個執行個體,而不是嘗試在較小的螢幕上放置這兩個執行個體的視窗。

多視窗模式驗證

無論應用程式是否以 API 級別 24 或以上版本為目標版本,都應驗證應用程式在多視窗模式中的行為,以免使用者嘗試在搭載 Android 7.0 或以上版本的裝置上以多視窗模式啟動應用程式。

設定測試裝置

如果裝置搭載 Android 7.0 或以上版本,系統會自動支援分割畫面模式。

如果應用程式的目標版本為 API 級別 23 或以下

當使用者嘗試在多視窗模式下使用應用程式時,若應用程式未宣告固定方向,則系統會強制調整應用程式大小。

如果應用程式未宣告固定方向,應在搭載 Android 7.0 或以上版本的裝置上啟動應用程式,並嘗試使應用程式進入分割畫面模式。驗證當強制調整應用程式大小時,使用者體驗是否令人滿意。

如果應用程式宣告了固定方向,請嘗試使應用程式進入多視窗模式。驗證當執行此動作後,應用程式是否仍維持全螢幕模式。

如果應用程式的目標版本為 API 級別 24 至 30

如果應用程式的目標版本為 API 級別 24 至 30,且未停用多視窗模式支援,請在分割畫面和任意形式模式下驗證下列行為:

  • 啟動應用程式全螢幕,然後長按「最近使用」按鈕以切換至多視窗模式。確認應用程式能正確切換。
  • 直接在多視窗模式中啟動應用程式,並驗證應用程式是否可以正確啟動。按下「最近使用」按鈕,然後長按應用程式的標題列,並將其拖曳到畫面上某個醒目顯示區域,即可在多視窗模式中啟動應用程式。
  • 拖曳畫面分隔線,即可在分割畫面模式中調整應用程式大小。確認應用程式在調整大小後不會異常終止,且會顯示必要的 UI 元素。
  • 如果您已為應用程式指定最小尺寸,請試著將應用程式調整到小於這些尺寸。驗證能否將應用程式的大小調整為低於指定的最小尺寸。
  • 透過所有測試,驗證應用程式的效能是否令人滿意。例如,驗證調整應用程式大小後,更新 UI 時的延遲是否過長。

如果應用程式的目標版本為 API 級別 31 或以上

如果應用程式的目標版本為 API 級別 31 或以上,而且主要活動的最小寬度和最小高度小於或等於可用的顯示區域尺寸,請驗證為API 級別 24 到 30 列出的所有行為。

注意:請檢查 Activity#isInMultiWindowMode() 的傳回值,透過程式化方式判斷應用程式是否處於多視窗模式。

測試檢查清單

如要驗證應用程式在多視窗模式中的應用程式效能,請嘗試下列作業。若非另有註明,請在分割畫面和任意形式模式下都嘗試執行這些作業。

  • 進入和退出多視窗模式。
  • 從應用程式切換到另一個應用程式,驗證當應用程式顯示但不活躍時能夠正常運作。例如,如果您的應用程式正在播放影片,請驗證當使用者與另一應用程式互動時,該應用程式是否繼續播放。
  • 在分割畫面模式中,請嘗試移動螢幕分隔線,調大和調小應用程式。請在並排設定和上下設定中執行這些作業。確認應用程式不會異常終止、顯示基本功能,且調整大小作業所需時間不會過長。
  • 快速連續執行多項大小調整作業。確認您的應用程式不會異常終止或外洩記憶體。Android Studio 的記憶體分析器會提供應用程式記憶體用量的相關資訊 (請參閱使用記憶體分析器檢查應用程式的記憶體用量)。
  • 在各種不同的視窗設定下正常使用應用程式,驗證應用程式是否正常運作。確認文字清晰易讀,且 UI 元素不會因過小而無法互動。

如果您已停用多視窗模式支援

在 API 級別 24 到 30 上,如果您設定 android:resizeableActivity="false" 以停用多視窗模式,請在搭載 Android 7.0 至 11 的裝置上啟動應用程式,並嘗試使應用程式進入分割畫面和任意形式模式。驗證當執行此動作後,應用程式是否仍維持全螢幕模式。

其他資源

如要進一步瞭解 Android 中的多視窗模式支援情況,請參閱: