활동 실행 정책은 앱 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()
메서드에서 적용됩니다.