建議做法

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

一般來說,應用程式不應仰賴靜態 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)。

舉例來說,下列顯示設定範例會啟用系統裝飾,並 模擬螢幕上的 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 用於顯示身分 名稱屬性中,模擬顯示畫面為 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」。

若需更多資訊,請參閱: