Android 12를 타겟팅하는 앱은 몇 가지 특수한 사례를 제외하고 백그라운드에서 실행되는 동안 더 이상 포그라운드 서비스를 시작할 수 없습니다. 앱이 백그라운드에서 실행되는 동안 포그라운드 서비스를 시작하려고 하지만 포그라운드 서비스가 예외 사례 중 하나를 충족하지 못하면 시스템에서 ForegroundServiceStartNotAllowedException
이 발생합니다.
포그라운드 서비스 권장 대안: WorkManager
앱이 이 변경사항으로 영향받는 경우 WorkManager를 사용하도록 이전하세요. WorkManager는 우선순위가 높은 백그라운드 작업을 시작하는 데 권장되는 솔루션입니다.
WorkManager 2.7.0부터 앱은 setExpedited()
를 호출하여 Worker
가 신속 처리 작업을 사용해야 한다고 선언할 수 있습니다. 이 새 API는 Android 12에서 실행될 때 신속 처리 작업을 사용하며 이전 버전의 Android에서는 포그라운드 서비스를 사용하여 이전 버전과의 호환성을 제공합니다.
다음 코드 스니펫은 setExpedited()
메서드 사용 방법의 예를 보여줍니다.
Kotlin
OneTimeWorkRequestBuilder<T>().apply { setInputData(inputData) setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST) }.build()
자바
OneTimeWorkRequest request = new OneTimeWorkRequestBuilder<T>() .setInputData(inputData) .setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST) .build();
CoroutineWorker.setForeground()
와 ListenableWorker.setForegroundAsync()
메서드는 포그라운드 서비스에서 지원되므로 같은 포그라운드 서비스 실행 제한과 예외가 적용됩니다. 편의적으로 API를 사용할 수 있지만 앱이 포그라운드 서비스를 시작하는 것을 시스템이 허용하지 않으면 예외를 처리할 준비를 합니다. 더 일관된 환경을 제공하려면 setExpedited()
를 사용하세요.
WorkManager 2.7.0에서 신속 처리 작업을 사용하는 방법에 관한 전체 예는 GitHub의 WorkManagerSample을 참고하세요.
신속 처리 작업
Android 12에서 새로 도입된 신속 처리 작업을 사용하면 앱이 짧고 중요한 작업을 실행하는 동시에 시스템에서는 리소스 액세스를 더 효과적으로 제어할 수 있습니다.
이러한 작업의 특성은 포그라운드 서비스와 일반적인 JobScheduler
작업 사이에 있습니다.
- 몇 분 안에 완료되는 짧은 작업용입니다. 앱에 할당량이 충분하지 않으면 시스템은 신속 처리 작업이 이미 3분 이상 실행되고 있는 경우 작업을 중지할 수 있습니다.
- 절전 모드와 잠자기 등 시스템의 전력 관리 제한사항에 영향을 덜 받습니다.
- 시스템의 현재 워크로드에서 실행이 가능하다면 시스템은 신속 처리 작업을 즉시 실행합니다.
신속 처리 작업은 지연될 수 있음
시스템은 작업이 호출된 후 최대한 빨리 지정된 신속 처리 작업을 실행하려고 합니다. 그러나 다른 유형의 작업과 마찬가지로 시스템은 다음과 같은 경우 신속 처리 작업의 시작을 지연시킬 수 있습니다.
- 시스템 부하가 너무 높습니다. 이는 이미 너무 많은 작업이 실행되고 있거나 시스템에 메모리가 충분하지 않을 때 발생할 수 있습니다.
- 신속 처리 작업 할당량 한도가 초과되었습니다. 신속 처리 작업은 앱 대기 버킷에 기반하는 할당량 시스템을 사용하고 롤링 시간 내에서 최대 실행 시간을 제한합니다. 신속 처리 작업에 사용되는 할당량은 다른 유형의 백그라운드 작업에 사용되는 할당량보다 더 제한됩니다.
Alarm Manager API에 미치는 영향
일반적으로 Android 12를 타겟팅하는 앱은 알람을 사용하여 포그라운드 서비스를 시작할 수 없습니다.
앱에서 시간에 민감한 알람이나 리마인더를 사용자에게 전송해야 하는 사용 사례를 지원하려면 정확한 알람이 울릴 때 포그라운드 서비스를 시작하면 됩니다. 정확한 알람을 설정하려면 앱에서 SCHEDULE_EXACT_ALARM
권한을 선언해야 합니다.
정확한 알람 권한 자세히 알아보기
백그라운드에서 포그라운드 서비스 실행이 허용되는 경우
다음 상황에서는 앱이 백그라운드에서 실행되는 동안에도 포그라운드 서비스를 시작할 수 있습니다.
- 앱이 활동과 같은 사용자에게 표시되는 상태에서 전환됩니다.
- 앱은 백그라운드에서 활동을 시작할 수 있습니다. 단, 앱이 기존 작업의 백 스택에 활동을 보유한 경우는 예외입니다.
- 앱이 Firebase 클라우드 메시징을 사용하여 우선순위가 높은 메시지를 수신합니다.
- 사용자가 앱과 관련된 UI 요소에서 작업을 실행합니다. 예를 들어 대화창이나 알림, 위젯, 활동과 상호작용할 수 있습니다.
- 앱이 지오펜싱이나 활동 감지 전환과 관련된 이벤트를 수신합니다.
- 기기가 재부팅되고 broadcast receiver에서
ACTION_BOOT_COMPLETED
나ACTION_LOCKED_BOOT_COMPLETED
,ACTION_MY_PACKAGE_REPLACED
인텐트 작업을 수신한 후의 경우입니다. - 앱이 broadcast receiver에서
ACTION_TIMEZONE_CHANGED
나ACTION_TIME_CHANGED
,ACTION_LOCALE_CHANGED
인텐트 작업을 수신합니다. - 앱이
BLUETOOTH_CONNECT
나BLUETOOTH_SCAN
권한이 필요한 블루투스 브로드캐스트를 수신합니다. - 앱에 기기 소유자와 프로필 소유자 등 특정 시스템 역할이나 권한이 있습니다.
앱에서 호환 기기 관리도구를 사용합니다.
호환 기기가 근처에 있을 때마다 시스템이 앱의 절전 모드를 해제하도록 하려면 Android 12에서 호환 기기 서비스를 구현합니다.
시스템에서 '고정' 포그라운드 서비스를 다시 시작합니다. 포그라운드 서비스를 고정하려면
onStartCommand()
에서START_STICKY
나START_REDELIVER_INTENT
를 반환합니다.사용자가 앱의 배터리 최적화를 사용 중지합니다. 시스템 설정에서 앱의 앱 정보 페이지로 사용자를 보내 사용자가 이 옵션을 찾도록 할 수 있습니다.
ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS
인텐트 작업이 포함된 인텐트를 호출하면 됩니다.