建議做法

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

一般來說,應用程式不應依賴靜態標識符或依賴某些顯示 ID 的邏輯。在大多數情況下,應用程式應該調整大小並在不同的顯示器上運行,並且系統應該控制應用程式的位置。例如,為可折疊設備建立全新且獨特的體驗,並在裝置折疊時在外部螢幕上啟動特殊應用程式。

在這種情況下,SystemUI(或其他系統元件)應會偵測折疊,確定是否適合執行操作,然後啟動目標活動並指定外部顯示 ID 作為啟動目標。應用程式不應檢測此操作或執行任何操作作為回應,然後在特定顯示器上執行啟動。換句話說,不要假設在一台設備上有效的內容也適用於其他設備。簡而言之,特定於設備的程式碼會增加碎片。

限制對顯示器的訪問

如果設備配置需要限制對一台或多台顯示器的訪問,建議使用Display#FLAG_PRIVATE標誌將此類顯示器指定為private 。這樣做會限制除所有者之外的所有人向顯示添加內容。除所有者之外的任何人嘗試啟動活動或新增視窗都會導致SecurityException 。如果系統擁有顯示器,則系統可以新增視窗並啟動活動。

此外,放置在顯示器上的實體始終可以存取該顯示器。如果擁有者在顯示器上啟動活動,則該活動可以在該顯示器上啟動其他活動。因此,所有者有責任限制存取並允許受信任的應用程式。

此外,虛擬顯示器還受到更多限制,因為任何應用程式都可以建立虛擬顯示器而不使其對使用者可見。如果虛擬顯示器不屬於系統,則僅允許具有allowEmbedded活動,且呼叫者應具有ACTIVITY_EMBEDDING權限。

有關更多信息,請參閱:

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

要有條件地控制活動啟動,請使用LaunchParamsController ,它會攔截所有活動啟動並允許系統元件修改用於啟動的參數。這在system_server中可用。

配置顯示視窗設定和系統裝飾

可以在DisplayWindowSettings中為每個顯示器配置系統裝飾。設備實作可以在/data/system/display_settings.xml中提供預設配置。

此值決定係統裝飾(啟動器、桌布、導覽列和其他裝飾視窗)和 IME 是否出現在顯示器上。有關詳細信息,請參閱DisplayWindowSettings#shouldShowSystemDecorsLocked()DisplayWindowSettings#shouldShowImeLocked()

若要識別顯示器,請使用唯一 ID(預設使用DisplayInfo#uniqueId )或硬體顯示器的實體連接埠 ID(請參閱DisplayInfo#address )。

例如,以下顯示配置範例在模擬顯示器上啟用系統裝飾和 IME:

<?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用於 name 屬性中的顯示標識,對於模擬顯示,該屬性為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>

有關詳細信息,請參閱靜態顯示標識符

有關更多信息,請參閱: