建議做法

適用於摺疊式和多螢幕裝置的應用程式

一般來說,應用程式不應仰賴靜態 ID 或邏輯,因為這些會依賴某些顯示 ID。在大多數情況下,應用程式應調整畫面大小並在不同的螢幕上運作,且系統應控制應用程式的位置。例如,為摺疊式裝置打造全新的獨特體驗,並在裝置摺疊時在外部螢幕上啟動特殊應用程式。

在這種情況下,SystemUI (或其他系統元件) 應偵測摺疊情況,判斷其是否適合執行某項操作,然後啟動目標活動,並指定外部螢幕 ID 做為啟動目標。應用程式不應偵測這項動作,也不應在回應中執行任何動作,然後在特定螢幕上執行啟動作業。換句話說,請勿假設在某部裝置上可運作的功能,也會在其他裝置上運作。簡而言之,裝置專屬程式碼會增加分散現象。

限制螢幕的存取權

如果裝置設定需要限制一或多個螢幕的存取權,建議您使用 Display#FLAG_PRIVATE 標記將這些螢幕指定為「私人」。否則除了擁有者外,其他擁有者不得在顯示畫面中新增內容。除了擁有者以外,任何人嘗試啟動活動或新增視窗,都會導致 SecurityException。如果系統擁有顯示器,則可新增視窗和啟動活動。

此外,放置在螢幕上的實體也可以隨時存取該螢幕。如果擁有者在螢幕上啟動活動,該活動就能在這個螢幕上啟動其他活動。因此,擁有者有責任限制存取權,並「僅」允許信任的應用程式

此外,虛擬螢幕會加入更多限制,因為任何應用程式都可以在不向使用者顯示的情況下建立這類螢幕。如果虛擬螢幕不是由系統所有,則系統只會允許具有 allowEmbedded 的活動,且呼叫端應擁有 ACTIVITY_EMBEDDING 權限。

詳情請參閱:

  • ActivityStackSupervisor#isCallerAllowedToLaunchOnDisplay()
  • ActivityDisplay#isUidPresent()
  • DisplayManagerService#isUidPresentOnDisplay()

如要有條件地控制活動的啟動作業,請使用 LaunchParamsController 來攔截所有活動啟動作業,並允許系統元件修改用於啟動的參數。「system_server」提供此功能。

調整螢幕視窗設定和系統裝飾

您可以在 DisplayWindowSettings 中為每個螢幕設定系統裝飾。裝置實作項目可在 /data/system/display_settings.xml 中提供預設設定。

這個值可決定螢幕上是否顯示系統裝飾 (啟動器、桌布、導覽列和其他裝飾視窗) 和輸入法編輯器。詳情請參閱 DisplayWindowSettings#shouldShowSystemDecorsLocked()DisplayWindowSettings#shouldShowImeLocked() 相關說明。

如要識別螢幕,請使用專屬 ID (預設使用 DisplayInfo#uniqueId) 或硬體螢幕的實體通訊埠 ID (請參閱 DisplayInfo#address)。

舉例來說,下列螢幕設定範例會在模擬螢幕上啟用系統裝飾和輸入法編輯器:

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<display-settings>
<config identifier="0" />
<display
  name="overlay:1"
  shouldShowSystemDecors="true"
  shouldShowIme="true" />
</display-settings>

在上述範例中,uniqueId 用於名稱屬性中的顯示識別資訊,針對模擬螢幕為 overlay:1。對於內建顯示器,範例值可能是 "local:45354385242535243453"。另一個做法是使用硬體埠資訊,並將 identifier="1" 設為對應 DisplayWindowSettings#IDENTIFIER_PORT,然後更新名稱以使用 "port:<port_id>" 格式:

<?xmlversion='1.0' encoding='utf-8' standalone='yes' ?>
<display-settings>
<config identifier="1" />
<display
  name="port:12345"
  shouldShowSystemDecors="true"
  shouldShowIme="true" />
</display-settings>

詳情請參閱「靜態顯示 ID」。

詳情請參閱: