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

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