Правила запуска действий

Поведение при запуске 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().