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