Android7.0 分屏多視窗
如果您使用 N Preview SDK 構建應用,則可以配置應用處理多視窗顯示的方法。 例如,您可以指定 Activity 的最小允許尺寸。 您還可以禁用應用的多視窗顯示,確保系統僅以全屏模式顯示應用。
概覽
Android N 允許多個應用同時共享螢幕。例如,使用者可以分屏顯示應用,在左邊檢視網頁,同時在右邊寫郵件。 使用者體驗取決於裝置:
- 執行 Android N 的手持裝置具有分屏模式。 在此模式中,系統以左右並排或上下並排的方式分屏顯示兩個應用。 使用者可以拖動兩個應用之間的分界線,放大其中一個應用,同時縮小另一個。
- 在執行 Android N 的 Nexus Player 上,應用能以
- 較大裝置的製造商可選擇啟用自由形狀模式,在該模式中,使用者可以自由調整各 Activity 的尺寸。 若製造商啟用此功能,裝置將同時具有自由形狀模式和分屏模式。
- 若使用者開啟 Overview 螢幕並長按 Activity 標題,則可以拖動該 Activity 至螢幕突出顯示的區域,使 Activity 進入多視窗模式。
- 若使用者長按 Overview 按鈕,裝置上的當前 Activity 將進入多視窗模式,同時將開啟 Overview 螢幕,使用者可在該螢幕中選擇要共享螢幕的另一個 Activity。
使用者可以在兩個 Activity 共享螢幕的同時在這兩個 Activity 之間拖放資料 (在此之前,使用者只能在一個 Activity 內部拖放資料)。
多視窗生命週期
在多視窗模式中,在指定時間只有最近與使用者互動過的 Activity 為活動狀態。 該 Activity 將被視為頂級 Activity。 所有其他 Activity 雖然可見,但均處於暫停狀態。 但是,這些已暫停但可見的 Activity 在系統中享有比不可見 Activity 更高的優先順序。 如果使用者與其中一個暫停的 Activity 互動,該 Activity 將恢復,而之前的頂級 Activity 將暫停。
注:在多視窗模式中,使用者仍可以看到處於暫停狀態的應用。 應用在暫停狀態下可能仍需要繼續其操作。 例如,處於暫停模式但可見的視訊播放應用應繼續顯示視訊。 因此,我們建議播放視訊的 Activity 不要暫停其 處理程式中的視訊。 應暫停 中的視訊,並恢復 中的視訊播放。
如處理執行時變更中所述,使用者使用多視窗模式顯示應用時,系統將通知 Activity 發生配置變更。 這也會發生在當用戶調整應用大小,或將應用恢復到全屏模式時。 該變更與系統通知應用裝置從縱向模式切換到橫向模式時的 Activity 生命週期影響基本相同,但裝置不僅僅是交換尺寸,而是會變更尺寸。 如處理執行時變更中所述,您的 Activity 可以自行處理配置變更,或允許系統銷燬 Activity,並以新的尺寸重新建立該 Activity。
如果使用者調整視窗大小,並在任意維度放大視窗尺寸,系統將調整 Activity 以匹配使用者操作,同時根據需要釋出執行時變更。 如果應用在新公開區域的繪製滯後,系統將使用 屬性或預設 windowBackgroundFallback
樣式屬性指定的顏色暫時填充該區域。
針對多視窗模式配置應用
如果您的應用面向 Android N,您可以對應用的 Activity 是否支援多視窗顯示以及顯示方式進行配置。 您可以在清單檔案中設定屬性,以控制大小和佈局。 根 Activity 的屬性設定適用於其任務棧中的所有 Activity。 例如,如果根 Activity 已 android:resizeableActivity
設定為 true,則任務棧中的所有 Activity 都將可以調整大小。
注:如果您使用低於 Android N 版本的 SDK 構建多向應用,則使用者在多視窗模式中使用應用時,系統將強制調整應用大小。 系統將顯示對話方塊,提醒使用者應用可能會發生異常。 系統不會調整定向應用的大小;如果使用者嘗試在多視窗模式下開啟定向應用,應用將全屏顯示。
android:resizeableActivity
在清單的 <activity>
或 <application>
節點中設定該屬性,啟用或禁用多視窗顯示:
<span class="pln" style="color: rgb(0, 0, 0);">android</span><span class="pun" style="color: rgb(102, 102, 0);">:</span><span class="pln" style="color: rgb(0, 0, 0);">resizeableActivity</span><span class="pun" style="color: rgb(102, 102, 0);">=[</span><span class="str" style="color: rgb(136, 0, 0);">"true"</span><span class="pln" style="color: rgb(0, 0, 0);"> </span><span class="pun" style="color: rgb(102, 102, 0);">|</span><span class="pln" style="color: rgb(0, 0, 0);"> </span><span class="str" style="color: rgb(136, 0, 0);">"false"</span><span class="pun" style="color: rgb(102, 102, 0);">]</span>
如果該屬性設定為 true,Activity 將能以分屏和自由形狀模式啟動。 如果此屬性設定為 false,Activity 將不支援多視窗模式。 如果該值為 false,且使用者嘗試在多視窗模式下啟動 Activity,該 Activity 將全屏顯示。
如果您的應用面向 Android N,但未對該屬性指定值,則該屬性的值預設設為 true。
android:supportsPictureInPicture
在清單檔案的 <activity>
節點中設定該屬性,指明 Activity 是否支援畫中畫顯示。 如果 android:resizeableActivity
為 false,將忽略該屬性。
<span class="pln" style="color: rgb(0, 0, 0);">android</span><span class="pun" style="color: rgb(102, 102, 0);">:</span><span class="pln" style="color: rgb(0, 0, 0);">supportsPictureInPicture</span><span class="pun" style="color: rgb(102, 102, 0);">=[</span><span class="str" style="color: rgb(136, 0, 0);">"true"</span><span class="pln" style="color: rgb(0, 0, 0);"> </span><span class="pun" style="color: rgb(102, 102, 0);">|</span><span class="pln" style="color: rgb(0, 0, 0);"> </span><span class="str" style="color: rgb(136, 0, 0);">"false"</span><span class="pun" style="color: rgb(102, 102, 0);">]</span>
佈局屬性
對於 Android N,<layout>
清單元素支援以下幾種屬性,這些屬性影響 Activity 在多視窗模式中的行為:
android:defaultWidth
- 以自由形狀模式啟動時 Activity 的預設寬度。
android:defaultHeight
- 以自由形狀模式啟動時 Activity 的預設高度。
android:gravity
- 以自由形狀模式啟動時 Activity 的初始位置。請參閱 參考資料,瞭解合適的值設定。
android:minimalHeight
、android:minimalWidth
- 分屏和自由形狀模式中 Activity 的最小高度和最小寬度。 如果使用者在分屏模式中移動分界線,使 Activity 尺寸低於指定的最小值,系統會將 Activity 裁剪為使用者請求的尺寸。
例如,以下節點顯示瞭如何指定 Activity 在自由形狀模式中顯示時 Activity 的預設大小、位置和最小尺寸:
<span class="tag" style="color: rgb(0, 0, 136);"><activity</span><span class="pln" style="color: rgb(0, 0, 0);"> </span><span class="atn" style="color: rgb(136, 34, 136);">android:name</span><span class="pun" style="color: rgb(102, 102, 0);">=</span><span class="atv" style="color: rgb(136, 0, 0);">".MyActivity"</span><span class="tag" style="color: rgb(0, 0, 136);">></span><span class="pln" style="color: rgb(0, 0, 0);"> </span><span class="tag" style="color: rgb(0, 0, 136);"><layout</span><span class="pln" style="color: rgb(0, 0, 0);"> </span><span class="atn" style="color: rgb(136, 34, 136);">android:defaultHeight</span><span class="pun" style="color: rgb(102, 102, 0);">=</span><span class="atv" style="color: rgb(136, 0, 0);">"500dp"</span><span class="pln" style="color: rgb(0, 0, 0);"> </span><span class="atn" style="color: rgb(136, 34, 136);">android:defaultWidth</span><span class="pun" style="color: rgb(102, 102, 0);">=</span><span class="atv" style="color: rgb(136, 0, 0);">"600dp"</span><span class="pln" style="color: rgb(0, 0, 0);"> </span><span class="atn" style="color: rgb(136, 34, 136);">android:gravity</span><span class="pun" style="color: rgb(102, 102, 0);">=</span><span class="atv" style="color: rgb(136, 0, 0);">"top|end"</span><span class="pln" style="color: rgb(0, 0, 0);"> </span><span class="atn" style="color: rgb(136, 34, 136);">android:minimalHeight</span><span class="pun" style="color: rgb(102, 102, 0);">=</span><span class="atv" style="color: rgb(136, 0, 0);">"450dp"</span><span class="pln" style="color: rgb(0, 0, 0);"> </span><span class="atn" style="color: rgb(136, 34, 136);">android:minimalWidth</span><span class="pun" style="color: rgb(102, 102, 0);">=</span><span class="atv" style="color: rgb(136, 0, 0);">"300dp"</span><span class="pln" style="color: rgb(0, 0, 0);"> </span><span class="tag" style="color: rgb(0, 0, 136);">/></span><span class="pln" style="color: rgb(0, 0, 0);"> </span><span class="tag" style="color: rgb(0, 0, 136);"></activity></span>
在多視窗模式中執行應用
Android N 添加了新功能,以支援可在多視窗模式中執行的應用。
多視窗模式中被禁用的功能
在裝置處於多視窗模式中時,某些功能會被禁用或忽略,因為這些功能對與其他 Activity 或應用共享裝置螢幕的 Activity 而言沒有意義。 此類功能包括:
- 某些系統 UI 自定義選項將被禁用;例如,在非全屏模式中,應用無法隱藏狀態列。
多視窗變更通知和查詢
類中添加了以下新方法,以支援多視窗顯示。 有關各方法的詳細資訊,請參閱 N Preview SDK 參考。
Activity.isInMultiWindowMode()
- 呼叫該方法以確認 Activity 是否處於多視窗模式。
Activity.isInPictureInPictureMode()
- 呼叫該方法以確認 Activity 是否處於畫中畫模式。
注:畫中畫模式是多視窗模式的特例。 如果
myActivity.isInPictureInPictureMode()
返回 true,則myActivity.isInMultiWindowMode()
也返回 true。 Activity.onMultiWindowModeChanged()
- Activity 進入或退出多視窗模式時系統將呼叫此方法。 在 Activity 進入多視窗模式時,系統向該方法傳遞 true 值,在退出多視窗模式時,則傳遞 false 值。
Activity.onPictureInPictureModeChanged()
- Activity 進入或退出畫中畫模式時系統將呼叫此方法。 在 Activity 進入畫中畫模式時,系統向該方法傳遞 true 值,在退出畫中畫模式時,則傳遞 false 值。
每個方法還有 版本,例如 Fragment.isInMultiWindowMode()
。
進入畫中畫模式
如需在畫中畫模式中啟動 Activity,請呼叫新方法 Activity.enterPictureInPictureMode()
。 如果裝置不支援畫中畫模式,則此方法無效。 如需瞭解詳細資訊,請參閱畫中畫文件。
在多視窗模式中啟動新 Activity
在啟動新 Activity 時,使用者可以提示系統如果可能,應將新 Activity 顯示在當前 Activity 旁邊。 要執行此操作,可使用標誌Intent.FLAG_ACTIVITY_LAUNCH_TO_ADJACENT
。 傳遞此標誌將請求以下行為:
- 如果裝置處於分屏模式,系統會嘗試在啟動系統的 Activity 旁建立新 Activity,這樣兩個 Activity 將共享螢幕。 系統並不一定能實現此操作,但如果可以,系統將使兩個 Activity 處於相鄰的位置。
- 如果裝置不處於分屏模式,則該標誌無效。
如果裝置處於自由形狀模式,則在啟動新 Activity 時,使用者可通過呼叫 ActivityOptions.setLaunchBounds()
指定新 Activity 的尺寸和螢幕位置。 如果裝置不處於多視窗模式,則該方法無效。
注:如果您在任務棧中啟動 Activity,該 Activity 將替換螢幕上的 Activity,並繼承其所有的多視窗屬性。 如果要在多視窗模式中以單獨的視窗啟動新 Activity,則必須在新的任務棧中啟動此 Activity。
支援拖放
使用者可以在兩個 Activity 共享螢幕的同時在這兩個 Activity 之間拖放資料 (在此之前,使用者只能在一個 Activity 內部拖放資料)。 因此,如果您的應用目前不支援拖放功能,您可以在其中新增此功能。
N Preview SDK 擴充套件了 android.view
軟體包,以支援跨應用拖放。 有關以下類和方法的詳細資訊,請參閱 N
Preview SDK 參考。
android.view.DropPermissions
- 令牌物件,負責指定對接收拖放資料的應用授予的許可權。
View.startDragAndDrop()
- 的新別名。要啟用跨
Activity 拖放,請傳遞新標誌
View.DRAG_FLAG_GLOBAL
。 如需對接收拖放資料的 Activity 授予 URI 許可權,可根據情況傳遞新標誌View.DRAG_FLAG_GLOBAL_URI_READ
或View.DRAG_FLAG_GLOBAL_URI_WRITE
。 View.cancelDragAndDrop()
- 取消當前正在進行的拖動操作。只能由發起拖動操作的應用呼叫。
View.updateDragShadow()
- 替換當前正在進行的拖動操作的拖動陰影。只能由發起拖動操作的應用呼叫。
Activity.requestDropPermissions()
測試應用的多視窗支援
無論您是否針對 Android N 更新應用,都應驗證應用在多視窗模式下的行為,以防使用者嘗試在執行 Android N 的裝置上以多視窗模式啟動應用。
配置測試裝置
如果在裝置上安裝 Android N,則將自動支援分屏模式。
如果應用並非使用 N Preview SDK 構建
如果您的應用不是使用 N Preview SDK 構建的,則使用者嘗試在多視窗模式中使用應用時,系統將強制調整應用大小,除非應用進行了定向宣告。
如果您的應用沒有進行定向宣告,則應在執行 Android N 的裝置上啟動應用,並嘗試將應用切換到分屏模式。 驗證並確保在強制調整應用大小時使用者體驗可接受。
如果應用進行了定向宣告,則應嘗試將應用切換到多視窗模式。 驗證並確保執行此操作後,應用仍保持全屏模式。
如果支援多視窗模式
如果您的應用是使用 N Preview SDK 構建的,且未禁用多視窗支援,則分別在分屏和自由形狀模式下驗證以下行為。
- 在全屏模式下啟動應用,然後通過長按 Overview 按鈕切換到多視窗模式。 驗證並確保應用正常切換。
- 直接在多視窗模式中啟動應用,驗證並確保應用正常啟動。 您可以按一下 Overview 按鈕,再長按應用的標題欄,並將其拖動到螢幕上任一突出顯示的區域,從而在多視窗模式中啟動應用。
- 拖動分界線,在分屏模式中調整應用的大小。 驗證並確保應用正常調整大小且未崩潰,並且必要的 UI 元素仍可見。
- 如果您指定了應用的最小尺寸,請嘗試將應用尺寸調整到低於最小值。 驗證並確保無法將應用尺寸調整到低於指定最小值。
- 完成所有測試後,驗證並確保應用效能可以接受。例如,驗證並確保調整應用大小後更新 UI 沒有長時間的滯後。
測試檢查單
要在多視窗模式中驗證應用效能,請執行以下操作。 除非另有說明,否則請分別在分屏和多視窗模式中執行以下操作。
- 進入和退出多視窗模式。
- 從您的應用切換到另一個應用,驗證並確保應用在非活動但可見的狀態下正常執行。 例如,如果您的應用在播放視訊,則驗證並確保在使用者與另一個應用互動時視訊仍在繼續播放。
- 在分屏模式中,嘗試移動分界線,放大或縮小應用。 分別在左右和上下並排顯示模式中嘗試這些操作。 驗證並確保應用不會崩潰,主要功能可見,且調整操作不需要過長時間。
- 快速連續執行幾次調整操作。驗證並確保應用不會崩潰或出現記憶體洩漏。 有關檢查應用記憶體使用率的資訊,請參閱檢視記憶體使用率。
- 在多個不同視窗配置中正常使用應用,驗證並確保應用正常執行。 驗證並確保文字可讀,且 UI 元素大小正常,不影響互動。
如果已禁用多視窗支援
如果您通過設定 android:resizableActivity="false"
禁用了多視窗支援,則應在執行 Android N 的裝置上啟動應用,並嘗試將應用切換到自由形狀和分屏模式。 驗證並確保執行此操作後,應用仍保持全屏模式。