Поведение запуска активности определяется режимами запуска в файлах 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()
.