適用於可折疊和多螢幕裝置的應用程式
一般來說,應用程式不應依賴靜態標識符或依賴某些顯示 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>
有關詳細信息,請參閱靜態顯示標識符。
有關更多信息,請參閱: