Android 10 (API 수준 29) 이상에서는 앱이 백그라운드에서 실행될 때 앱이 활동을 시작할 수 있는 시점을 제한합니다. 이러한 제한사항은 사용자의 중단을 최소화하고 사용자가 화면에 표시되는 내용을 더 잘 제어할 수 있도록 지원합니다.
이 가이드에서는 백그라운드에서 활동을 시작하는 대안으로 알림을 제공합니다. 또한 제한사항이 적용되지 않는 특정 사례를 나열합니다.
대신 알림 표시
거의 모든 경우에 백그라운드에 있는 앱은 활동을 직접 시작하는 대신 시간에 민감한 알림을 표시하여 사용자에게 긴급한 정보를 제공해야 합니다. 이러한 알림에는 수신 전화 처리 또는 활성 알람 시계가 포함됩니다.
이 알림 기반 알림 및 미리 알림 시스템은 사용자에게 다음과 같은 여러 이점을 제공합니다.
- 기기를 사용할 때 사용자에게는 응답할 수 있는 헤드업 알림이 표시됩니다. 사용자는 현재 환경설정을 유지하고 화면에 표시되는 콘텐츠를 관리합니다.
- 시간에 민감한 알림은 사용자의 방해 금지 모드 규칙을 따릅니다. 예를 들어 사용자는 방해 금지 모드가 사용 설정된 경우 특정 연락처 또는 반복 발신자의 전화만 허용할 수 있습니다.
- 기기 화면이 꺼져 있으면 전체 화면 인텐트가 즉시 실행됩니다.
- 기기의 설정 화면에서 사용자는 특정 알림 채널을 포함하여 최근에 알림을 보낸 앱을 확인할 수 있습니다. 이 화면에서 사용자는 알림 환경설정을 관리할 수 있습니다.
앱이 활동을 시작할 수 있는 경우
Android 10 이상에서 실행되는 앱은 다음 조건 중 하나 이상을 충족하는 경우 활동을 시작할 수 있습니다.
앱에 포그라운드의 활동과 같은 보이는 창이 있습니다.
앱의 포그라운드 작업 백 스택에 활동이 있습니다.
앱에 아주 최근에 시작된 활동이 있습니다.
앱이 아주 최근에 활동에서
finish()을(를) 호출했습니다. 이 조건은finish()가 호출될 때 앱의 포그라운드에 활동이 있거나 포그라운드 작업 백 스택에 활동이 있는 경우에만 적용됩니다.앱에 시스템에서 바인드한 다음 서비스 중 하나가 있습니다. 이러한 서비스는 UI를 실행해야 할 수 있습니다.
AccessibilityServiceAutofillServiceCallRedirectionServiceHostApduServiceInCallServiceTileService(Android 14 (API 수준 34) 이상에서는 적용되지 않음)VoiceInteractionServiceVrListenerService.
앱에 표시된 다른 앱에서 바인드한 서비스가 있습니다. 백그라운드의 앱이 성공적으로 활동을 시작하려면 서비스에 바인드된 앱이 계속 표시되어야 합니다.
앱이 시스템에서 알림
PendingIntent을 수신합니다. 서비스 및 broadcast receiver의 대기 중 인텐트의 경우 앱은 대기 중 인텐트가 전송된 후 몇 초 동안 활동을 시작할 수 있습니다.앱이 표시된 다른 앱에서 전송된
PendingIntent를 수신합니다.앱이 UI를 실행할 것으로 예상되는 시스템 브로드캐스트를 수신합니다. 예로는
ACTION_NEW_OUTGOING_CALL및SECRET_CODE_ACTION이 있습니다. 브로드캐스트가 전송된 후 몇 초 동안 앱이 활동을 시작할 수 있습니다.앱이 컴패니언 하드웨어 기기와
CompanionDeviceManagerAPI를 통해 연결됩니다. 이 API를 사용하면 앱이 페어링된 기기에서 사용자가 진행하는 작업에 대한 응답으로 활동을 시작할 수 있습니다.앱이 기기 정책 컨트롤러로 기기 소유자 모드에서 실행됩니다. 사용 사례로는 완전 관리형 엔터프라이즈 기기 및 디지털 신호계와 키오스크 같은 전용 기기가 있습니다.
사용자가 앱에
SYSTEM_ALERT_WINDOW권한을 부여합니다.
PendingIntent에서 활동을 시작할 때 선택 필요
나열된 조건을 기반으로 실수로 활동이 시작되는 것을 방지하기 위해 Android 14부터 활동 시작에 대한 앱 권한을 선택하거나 선택 해제할 수 있는 명시적 API가 있습니다.
Android 15 이상을 타겟팅하는 앱은 기본적으로 더 이상 생성하는 PendingIntents에 백그라운드 활동 실행 (BAL) 권한을 암시적으로 부여하지 않습니다. 이렇게 하려면 명시적 선택이 필요합니다. 앱이 PendingIntents를 전송하는지 또는 생성하는지에 따라 다음과 같은 옵션이 있습니다.
PendingIntent의 발신자
PendingIntent를 시작하려는 Android 14 이상을 타겟팅하는 앱은
- 나열된 조건을 충족하고
- 이러한 예외를 기반으로 백그라운드 활동 실행을 허용하도록 선택해야 합니다.
이 선택은 앱 개발자가 앱이 활동을 시작할 것이라고 알고 있는 경우에만 발생해야 합니다.
선택하려면 앱은 ActivityOptions 번들을
setPendingIntentBackgroundActivityStartMode(ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED)
PendingIntent.send() 또는 유사한 메서드에 전달해야 합니다.
PendingIntent의 생성자
대부분의 경우 PendingIntent를 시작하는 앱이 선택해야 합니다.
그러나 생성 앱에서 이러한 권한을 부여해야 하는 경우
- 생성 앱이 표시되는 동안 언제든지
PendingIntent를 시작할 수 있습니다. - 생성 앱에 특별한 권한이 있는 경우 언제든지
PendingIntent를 시작할 수 있습니다.
선택하려면 앱은 ActivityOptions 번들을
setPendingIntentCreatorBackgroundActivityStartMode
(ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED)에 전달해야 합니다.
PendingIntent.getActivity() 또는 유사한 메서드
자세한 내용은 관련 참고 문서를 참고하세요.
ActivityOptions.setPendingIntentBackgroundActivityStartModeActivityOptions.setPendingIntentCreatorBackgroundActivityStartMode
엄격 모드
Android 16부터 앱 개발자는 엄격 모드를 사용 설정하여 활동 실행이 차단될 때 (또는 앱의 타겟 SDK가 올라갈 때 차단될 위험이 있는 경우) 알림을 받을 수 있습니다.
애플리케이션, 활동 또는 기타 애플리케이션 구성요소의 Application.onCreate() 메서드 초기에 사용 설정하는 코드 예는 다음과 같습니다.
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
StrictMode.setVmPolicy(
StrictMode.VmPolicy.Builder()
.detectBlockedBackgroundActivityLaunch()
.penaltyLog()
.build());
)
}
자세한 내용은 엄격 모드 문서를 참고하세요.