이제 Android 14 베타를 사용할 수 있습니다. 지금 사용해 보시고 의견을 알려 주세요.

포그라운드 서비스 실행 제한

Android 12를 타겟팅하는 앱은 몇 가지 특수한 사례를 제외하고 백그라운드에서 실행되는 동안 더 이상 포그라운드 서비스를 시작할 수 없습니다. 앱이 백그라운드에서 실행되는 동안 포그라운드 서비스를 시작하려고 하지만 포그라운드 서비스가 예외 사례 중 하나를 충족하지 못하면 시스템에서 ForegroundServiceStartNotAllowedException이 발생합니다.

앱이 이 변경사항으로 영향받는 경우 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 권한을 선언해야 합니다.

정확한 알람 권한 자세히 알아보기

백그라운드에서 포그라운드 서비스 실행이 허용되는 경우

다음 상황에서는 앱이 백그라운드에서 실행되는 동안에도 포그라운드 서비스를 시작할 수 있습니다.