Политика запуска активности

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