外接螢幕可將電腦分割視窗體驗延伸至標準手機,讓使用者透過行動裝置存取大螢幕。這項功能可為應用程式互動和使用者工作效率帶來全新可能。
電腦分割視窗的所有獨特功能都適用於連線螢幕。將手機連接到螢幕時,手機狀態不會改變,且連接的螢幕會啟動空白桌面工作階段。裝置和螢幕會做為兩個獨立系統,每個螢幕都有專屬的應用程式。
如果將支援電腦分割視窗的裝置 (例如平板電腦) 連接到外接螢幕,電腦工作階段會延伸至兩個螢幕。兩個螢幕會像一個連續的系統一樣運作。這樣一來,視窗、內容和游標就能在兩個螢幕之間自由移動。
如要有效支援外接螢幕,您必須留意應用程式設計和實作的幾個面向。下列最佳做法可確保使用者體驗流暢且有效率。
處理動態顯示變更
許多應用程式在建構時,都假設 Display 物件及其特性在應用程式生命週期內不會改變。不過,當使用者連接或中斷連接外接螢幕,甚至在螢幕之間移動應用程式視窗時,與應用程式內容或視窗相關聯的基礎 Display 物件可能會變更。螢幕的大小、解析度、刷新率、HDR 支援和密度等屬性可能都不同。舉例來說,如果您根據手機螢幕對值進行硬式編碼,版面配置可能會在外部螢幕上中斷。
外接螢幕的像素密度也可能大不相同。您必須確保應用程式能正確回應密度變化。包括使用密度獨立像素 (dp) 設定版面配置、提供特定密度的資源,以及確保 UI 適當縮放。
如果活動在外接螢幕上執行,而螢幕中斷連線,系統會將活動移至主要螢幕。這項操作會觸發設定變更 (例如螢幕大小和密度變更),可能導致系統重新建立活動。應用程式必須儲存及還原 UI 狀態,處理設定變更,以免資料遺失或使用者體驗不佳。
使用正確的脈絡
在多螢幕環境中,使用適當的背景資訊至關重要。存取資源時,活動內容與應用程式內容並不相同,前者會顯示在畫面上,而後者不會。
活動內容包含螢幕的相關資訊,而且一律會根據活動顯示的螢幕區域進行調整,方便您取得應用程式目前的正確螢幕密度或視窗指標資訊。如需目前的視窗或螢幕資訊,請一律使用活動內容 (或其他使用者介面式內容)。這也會影響部分使用背景資訊的系統 API。
在 Jetpack Compose 中,您可以使用 CompositionLocal 物件 (例如 LocalConfiguration.current 和 LocalDensity.current) 存取螢幕專屬資訊。當活動或視窗在螢幕之間移動時,裝置設定會變更,觸發使用新螢幕指標的重組。CompositionLocal 物件可讓 UI 順暢調整。
取得螢幕資訊
您可以使用 Display 類別取得螢幕大小、密度或旗標等資訊。使用 DisplayManager 系統服務取得可用的螢幕。如要識別外接螢幕,請篩除 Display.DEFAULT_DISPLAY,這通常是內建的手機或平板電腦螢幕:
val displayManager = getSystemService(Context.DISPLAY_SERVICE) as DisplayManager val displays = displayManager.getDisplays() // The default display is 0. External displays have other IDs. val externalDisplays = displays.filter { it.displayId != Display.DEFAULT_DISPLAY }
管理活動啟動和設定
如果連接多個螢幕,應用程式啟動或建立其他活動時,可以指定要在哪個螢幕上執行。這個行為取決於資訊清單檔案中定義的活動啟動模式,以及啟動活動的實體所設定的意圖旗標和選項。
當活動移至第二螢幕時,應用程式可能會執行情境更新、調整視窗大小,以及設定和資源變更。如果活動處理了設定變更,則會在 onConfigurationChanged() 中通知活動。否則,系統會重新啟動活動。
如果活動所選取的啟動模式允許多個執行個體,則在次要螢幕上啟動活動時,系統會建立活動的新執行個體。這兩個活動會同時恢復,這對某些多工處理情境很有幫助。
您可以使用 ActivityOptions 在特定螢幕上啟動活動。請注意,launchDisplayId 需要 Android 8 (API 級別 26) 以上版本。
// Get DisplayManager and find the first external display. val displayManager = getSystemService(Context.DISPLAY_SERVICE) as DisplayManager val externalDisplayId = displayManager.displays .firstOrNull { it.displayId != Display.DEFAULT_DISPLAY } ?.displayId // If an external display is found, launch the activity on it. if (externalDisplayId != null) { val intent = Intent(this, MySecondaryActivity::class.java) val options = ActivityOptions.makeBasic() if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { options.launchDisplayId = externalDisplayId } startActivity(intent, options.toBundle()) } else { // Optionally, handle the case where no external display is connected. }
避免使用裝置許可清單
應用程式有時會透過許可清單,或檢查 BUILD.MODEL 和內建螢幕大小,限制特定裝置的大螢幕 UI 和功能。這種方法不適用於外接螢幕,因為幾乎任何裝置都可以連接到大螢幕,而且連接外接螢幕時,裝置型號不會改變。
請勿使用許可清單或檢查 BUILD.MODEL 和內建顯示大小,而是在執行階段檢查視窗指標或裝置功能,以做出 UI 決策。使用 Jetpack WindowManager API 或視窗大小類別,針對各種螢幕大小和密度建構回應式和自動調整式版面配置。
支援外部周邊裝置
使用者連接外接螢幕時,通常會建立更類似桌面的環境。這通常涉及使用外接鍵盤、滑鼠、觸控板、網路攝影機、麥克風和喇叭。您必須確保應用程式能與這些周邊裝置完美搭配運作。包括處理鍵盤快速鍵、管理滑鼠游標互動、正確支援外接攝影機或麥克風,以及遵循音訊輸出轉送。詳情請參閱「大螢幕的輸入相容性」。
提升使用者工作效率
外接螢幕可大幅提升使用者工作效率。您現在已掌握相關工具,可建構能提供與電腦應用程式媲美體驗的行動應用程式。建議導入下列功能,提高使用者工作效率:
- 允許使用者開啟同一個應用程式的多個執行個體。這項功能在比較文件、管理不同對話或同時查看多個檔案等工作時,非常實用。
- 使用者可透過拖放功能,在應用程式內外分享多媒體資料。
- 實作穩健的狀態管理系統,協助使用者在設定變更時維持工作流程。
只要遵循這些指南並使用提供的程式碼範例,就能建立可順暢適應外接螢幕的應用程式,為使用者提供更豐富、更有效率的體驗。