活動啟動行為是由應用程式 AndroidManifest.xml
檔案中的啟動模式、意圖旗標和呼叫端提供的 ActivityOptions 定義。使用 ActivityOption#setLaunchDisplayId(int)
指定活動啟動時的特定顯示裝置。
- 根據預設,活動會在與呼叫端相同的螢幕上啟動。舉例來說,從啟動器啟動的活動的新例項應放置在相同的螢幕上,且不應加入其他標記或選項。請務必使用正確的啟動內容 (活動與應用程式)。
- 如果啟動作業是從與特定顯示畫面無關的來源 (例如從殼層或應用程式內容) 執行,則活動會放置在使用者上次與裝置互動或上次啟動活動的頂端顯示畫面。
- 啟動活動的意圖可解析為系統中現有的活動例項。在這種情況下,如果未提供其他標記,活動會顯示在上次使用活動的相同畫面上。如果使用
ActivityOptions#setTargetDisplayId()
指定目標顯示裝置,系統會將活動移至該裝置 (如果安全性和其他限制允許的話)。
安全性限制
為避免惡意應用程式從其建立的虛擬顯示器表面讀取使用者敏感資訊,進而濫用這些資訊,應用程式只能在 Android 10 中的虛擬顯示器上啟動自身的活動。不過,請注意以下幾點:
- 具有
INTERNAL_SYSTEM_WINDOW
權限的系統元件可在任何螢幕上啟動。 - 具有
ACTIVITY_EMBEDDING
權限的呼叫者可以從具有ActivityInfo.FLAG_ALLOW_EMBEDDED
標記的其他應用程式啟動活動。 - 只有該螢幕的擁有者或活動,才能在私人螢幕上啟動活動。
在螢幕上新增視窗時,也適用類似的限制。
Android 10 包含 ActivityManager#isActivityStartAllowedOnDisplay(Context context, int
displayId, Intent intent)
方法,可在嘗試在螢幕上啟動應用程式前,先檢查應用程式的安全限制。在 Android 9 (和以下版本) 中,限制啟動結果會擲回 SecurityException
。
大多數的安全性限制都是在 ActivityStackSupervisor#isCallerAllowedToLaunchOnDisplay()
方法中套用。