Andr oid 多窗 口編程

Android 多窗 口編程

多窗口支持

Android N 添加了對同時顯示多個應用窗口的支持。 在手持設備上,兩個應用可以在“分屏”模式中左右並排或上下並排顯示。 在電視設備上,應用可以 使用“畫中畫”模式,在用戶與另一個應用交互的同時繼續播放視頻。

如果您使用 N Preview  SDK 構建應用,則可以配置應用處理多窗口顯示的方法。 例如,您可以指定 Activity 的最小允許尺寸。 您還可以禁用應用的多窗 口顯示,確保系統僅以全屏模式顯示應用。

概覽

Android N 允許多個應用同 時共享屏幕。例如,用戶可以分屏顯示應用,在左邊查看網頁,同時在右邊寫郵件。 用戶體驗取決於設備:

運行 Android N 的手持設備具有分屏模式。 在此模式中,系統以左右並排或上下並排的方式分屏顯示兩個應用。 用戶可以拖動兩個應用之間的分界線,放大其中一個應用,同時縮小另一個。
在運行 Android N 的 Nexus Player 上 ,應用能以畫中畫模式顯示,即在用戶瀏覽網頁或與其他應用交互的同時繼續顯示內容。
較大設備的製造商可選 擇啓用自由形狀模式,在該模式中,用戶可以自由調整各 Activity 的尺寸。 若製造商啓用此功能,設備將同時具有自由形狀模式和分屏模式。


圖 1. 兩個應用在分屏模式中左 右並排顯示。

用戶可以通過以 下方式切換到多窗口模式:

若用戶打開 Overview 屏幕並長按 Activity 標題,則可以拖動該 Activity 至屏幕突出顯示的區域,使 Activity 進入多窗口模式。
若用戶長按 Overview 按鈕,設備上的當前 Activity 將進入多窗口模式,同時將打開 Overview 屏幕,用戶可在該屏幕中選擇要共享屏幕的另一個 Activity。
用戶可以在兩個 Activity 共享屏幕的同時在這兩個 Activity 之間拖放數據 (在此之前,用戶只能在一個 Activity 內部拖放數據)。

多窗口生命週期

多窗口模式不會更改 Activity 生命週期 。

在多窗口模式中,在指定時間只有最近與用戶交互過的 Activity 爲活動狀態。 該 Activity 將被視爲頂級 Activity。 所有其他 Activity 雖然可見,但均處於暫停狀態。 但是, 這些已暫停但可見的 Activity 在系統中享有比不可見 Activity 更高的優先級。 如果用戶與其中一個暫停的 Activity 交互,該 Activity 將恢復,而之前的頂級 Activity 將暫停。

注:在多窗口模式中,用戶仍可以看到處於暫停狀態的應用。 應用在暫停狀態下可能仍需要繼續其操作。 例如,處於暫停模式但可見的視頻播放應用應繼續顯示視頻。  因此,我們建議播放視頻的 Activity 不要暫停其 onPause() 處理程序中的視頻。 應暫停 onStop() 中的視頻,並恢復 onStart() 中的視頻播放。

如處理運行時變更中所述,用戶使用多窗口模式顯示應用時,系統將通知 Activity 發生配置變更。 這也會發生在當用戶調整應用大小,或將應用恢復到全屏模式時。 該變更與系統通知應用設備從縱向模式切換到橫向模式時的 Activity 生命週期影響基本相同,但設備不僅僅是交換尺寸,而是會變更尺寸。 如處理運行時變更中所述,您的 Activity 可以自行處理配置變更,或允許系統銷燬 Activity,並以新的尺寸重新創建該 Activity。 

如果用戶調整窗口大小,並在任意維度放大窗口尺寸,系統將調整 Activity 以匹配用戶操作,同時根據需要發佈運行時變更。 如果應用在新公開區域的繪製滯後,系統將使用 windowBackground 屬性或默認 windowBackgroundFallback 樣式屬性指定的顏色暫時填充該區域。

針對多窗口模式配置應用

如果您的應用面向 Android N,您可以對應用的 Activity 是否支持多窗口顯示以及顯示方式進行配置。 您可以在清單文件中設置屬性,以控制大小和佈局。 根 Activity 的屬性設置適用於其任務棧中的所有 Activity。 例如,如果根 Activity 已 android:resizeableActivity 設定爲 true, 則任務棧中的所有 Activity 都將可以調整大小。

注:如果您使用低於 Android N 版本的 SDK 構建多向應用,則用戶在多窗口模式中使用應用時,系統將強制調整應用大小。 系統將顯示對話框,提醒用戶應用可能 會發生異常。 系統不會調整定向應用的大小;如果用戶嘗試在多窗口模式下打開定向應用,應用將全屏顯示。

android:resizeableActivity
在清單的 <activity> 或 <applicat ion> 節點中設置該屬性,啓用或禁用多窗口顯示:

android:resizeableActivity=["true" | "false"]

如果該屬性設置爲 true,Activity 將能以分屏和自由形狀模式啓動。 如果此屬性設置爲 false,Activity 將不支持多窗口模式。 如果該值爲 false,且用戶嘗試在 多窗口模 式下啓動 Activity,該 Activity 將全屏顯示。

如果您的應用面向 Android N,但未對 該屬性指定值,則該屬性的值默認設爲 true。

android:supportsPictureInPicture
在清單文件的 activity 節點中設置該屬性,指明 Activity 是否支持畫中畫顯示。 如果 android:resizeableActivity 爲 false,將忽略該屬性。

android:supportsPictureInPicture=["true" | "false"]

佈局屬性

對於 Android layout 清單元素 支持以下幾種屬性,這些屬性影響 Activity 在多窗口模式中的行爲:

android:defa ultWidth
以自由形狀模式啓動時 Activity 的默認寬度。
android:defaultHe ight
以自由形狀模 式啓動時 Activity 的默認高度。
android:gravity
以自由形狀模式啓動時 Activity 的初始位置。請參閱 Gravity 參考資料,瞭解合適的值設置。
android:minimalHeight、android:minimalWidth
分屏和自由形狀模式中 Activity 的最小高度和最小寬度。 如果用戶在分屏模式中移動分界線,使 Activity 尺寸低於指定的最小值,系統會將 Activity 裁剪爲用戶請求的尺寸。
例如,以下節點顯示瞭如何指定 Activity 在自由形狀模式中顯示時 Activity 的默認大小、位置和最小尺寸:

<activity android:name=".MyActivity">
    <layout android:defa ultHeight="500dp"
          android:defaultWidth="600dp"
          android:gra vity="top|end"
          android:minimalHeight="450dp"
          android:minimalWidth="300dp" />
</activity>

在多窗口模式中運行應用

Android N 添加了新功能,以支持可在多窗口模式中運行的應用。

多窗口模式中被禁用的功能

在設備處於多窗口模式中時,某 些功能會被禁用或忽略,因爲這些功能對與其他 Activity 或應用共享設備屏幕的 Activity 而言沒有意義。 此類功能包括:

某些系統 UI 自定義選項 將被禁用;例如,在非全屏模式中,應用無法隱藏狀態欄。
系統將忽略對 android:screenOrientation 屬性所作的更改。

多窗口變更通知和查詢

Activity 類中添加了以下新方法,以支持多窗口顯示。
Activity.isInMultiWindow Mode()
調用該方法以確認 Activity 是否處於多窗口模式。
Activity.isInPictureInPictureM ode()
調用該方法以確認 Activity 是否處於畫中畫模式。
注:畫中畫模式是多窗口模式的特例。 如果 myActivity.isInPictureInPictureMode() 返回 true,則 myActivity.isInMultiWindowMode() 也返回 true。

Activity.onMultiWindowModeChanged()
Activity 進入或退出多窗口模式時系統將調用此方法。 在 Activity 進入多窗口模式時,系統向該方法傳遞 true 值,在退出多窗口模式時,則傳遞 false 值。
Activity.onPictureInPictureModeChanged()
Activity 進入或退出畫中畫模式時系統將調用此方法。 在 Activity 進入畫中畫模式時,系統向該方法傳遞 true 值,在退出畫中畫模式時,則傳遞 false 值。 
每個方法還有 Fragment 版本,例如 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 軟件包,以支持跨應用拖放。

android.view.DropPermissions 
令牌對象,負責指定對接收拖放數據的應用授予的權限。
View.startDragAndDrop()
View.startDrag() 的新別名。要啓用跨 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()
請求使用 DragEvent 中包含的 ClipData 傳遞的內容 URI 的權限。

測試應用的多窗口支持

無論您是否針對 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 的設備上啓動應用,並嘗試將應用切換到自由形狀和分屏模式。 驗證並確保執行此操作後,應用仍保持全屏模式。


原地址:https://gold.xitu.io/post/58440d7d79bc440065bb32e1  支持下!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章