Поведение при запуске Activity определяется режимами запуска в файлах AndroidManifest.xml приложений, флагами намерений и объектами ActivityOptions, предоставленными вызывающей стороной. Используйте ActivityOption#setLaunchDisplayId(int), чтобы указать, на каком экране запускать действие.
- По умолчанию действие запускается на том же экране, что и звонок. Например, новый экземпляр действия, запущенный из панели запуска, должен быть размещен на том же экране без дополнительных флагов или параметров. Убедитесь, что вы используете правильный контекст (Activity или Application) для запуска.
- Если запуск выполняется из источника, не связанного с определенным дисплеем (например, из оболочки или контекста приложения), то действие помещается на верхний дисплей, на котором пользователь в последний раз взаимодействовал с устройством или с которого было запущено последнее действие.
- Намерение запустить действие может быть разрешено для существующего экземпляра действия в системе. В таком случае, если не были указаны дополнительные флаги, действие будет показано на том же экране, на котором оно использовалось в последний раз. Если целевой дисплей указан с помощью
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().