포그라운드 서비스 유형은 필수 항목임

To help developers be more intentional with defining user-facing foreground services, Android 10 introduced the android:foregroundServiceType attribute within the <service> element.

If your app targets Android 14, it must specify appropriate foreground service types. As in previous versions of Android, multiple types can be combined. This list shows the foreground service types to choose from:

If a use case in your app isn't associated with any of these types, we strongly recommend that you migrate your logic to use WorkManager or user-initiated data transfer jobs.

The health, remoteMessaging, shortService, specialUse, and systemExempted types are new in Android 14.

The following code snippet provides an example of a foreground service type declaration in the manifest:

<manifest ...>
  <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
  <uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK" />
    <application ...>
      <service
          android:name=".MyMediaPlaybackService"
          android:foregroundServiceType="mediaPlayback"
          android:exported="false">
      </service>
    </application>
</manifest>

If an app that targets Android 14 doesn't define types for a given service in the manifest, then the system will raise MissingForegroundServiceTypeException upon calling startForeground() for that service.

포그라운드 서비스 유형을 사용할 새로운 권한 선언

If apps that target Android 14 use a foreground service, they must declare a specific permission, based on the foreground service type, that Android 14 introduces. These permissions appear in the sections labeled "permission that you must declare in your manifest file" in the intended use cases and enforcement for each foreground service type section on this page.

All of the permissions are defined as normal permissions and are granted by default. Users cannot revoke these permissions.

런타임에 포그라운드 서비스 유형 포함

포그라운드 서비스를 시작하는 애플리케이션에 관한 권장사항은 포그라운드 서비스 유형의 비트 정수를 전달하는 startForeground()ServiceCompat 버전 (androidx-core 1.12 이상에서 사용 가능)을 사용하는 것입니다. 하나 이상의 유형 값을 전달하도록 선택할 수 있습니다.

일반적으로 특정 사용 사례에 필요한 유형만 선언해야 합니다. 이렇게 하면 각 포그라운드 서비스 유형에 관한 시스템의 기대치를 더 쉽게 충족할 수 있습니다. 포그라운드 서비스가 여러 유형으로 시작되는 경우 포그라운드 서비스는 모든 유형의 플랫폼 시행 요구사항을 준수해야 합니다.

ServiceCompat.startForeground(0, notification, FOREGROUND_SERVICE_TYPE_LOCATION)

포그라운드 서비스 유형이 호출에서 지정되지 않으면 유형은 매니페스트에서 정의된 값으로 기본 설정됩니다. 매니페스트에서 서비스 유형을 지정하지 않으면 시스템에서 MissingForegroundServiceTypeException이 발생합니다.

포그라운드 서비스를 실행한 후 새 권한이 필요하면 startForeground()를 다시 호출하고 새 서비스 유형을 추가해야 합니다. 예를 들어 피트니스 앱에서 항상 location 정보가 필요하지만 media 권한이 필요할 수도 있고 필요하지 않을 수도 있는 달리기 추적기 서비스를 실행한다고 가정해 보겠습니다. 매니페스트에서 locationmediaPlayback를 모두 선언해야 합니다. 사용자가 달리기를 시작하고 위치만 추적하고 싶다면 앱은 startForeground()를 호출하고 location 서비스 유형만 전달해야 합니다. 그런 다음, 사용자가 오디오 재생을 시작하려면 startForeground()를 다시 호출하고 location|mediaPlayback를 전달합니다.

시스템 런타임 검사

시스템은 포그라운드 서비스 유형의 올바른 사용을 확인하고, 앱이 적절한 런타임 권한을 요청했거나 필수 API를 사용하는지 확인합니다. 예를 들어 시스템은 포그라운드 서비스 유형 FOREGROUND_SERVICE_TYPE_LOCATION 유형을 사용하는 앱이 ACCESS_COARSE_LOCATION 또는 ACCESS_FINE_LOCATION을 요청할 것으로 예상합니다.

즉, 앱은 사용자에게 권한을 요청하고 포그라운드 서비스를 시작할 때 매우 구체적인 작업 순서를 따라야 합니다. 앱이 startForeground()를 호출하려고 하기 전에 권한을 요청하고 부여받아야 합니다. 포그라운드 서비스가 시작된 후 적절한 권한을 요청하는 앱은 이 작업 순서를 변경하고, 포그라운드 서비스를 시작하기 전에 권한을 요청해야 합니다.

플랫폼 시행의 세부정보는 이 페이지에 있는 각 포그라운드 서비스 유형의 의도된 사용 사례 및 시행에서 '런타임 요구사항' 섹션에 나와 있습니다.

각 포그라운드 서비스 유형의 의도된 사용 사례 및 시행

지정된 포그라운드 서비스 유형을 사용하려면 매니페스트 파일에서 특정 권한을 선언하고 특정 런타임 요구사항을 충족해야 하며 앱은 해당 유형의 의도된 사용 사례 세트 중 하나를 충족해야 합니다. 다음 섹션에서는 선언해야 하는 권한, 런타임 기본 요건, 각 유형의 의도된 사용 사례를 설명합니다.

카메라

매니페스트에서 android:foregroundServiceType 아래 선언할 포그라운드 서비스 유형
camera
매니페스트에서 선언할 권한
FOREGROUND_SERVICE_CAMERA
startForeground()에 전달할 상수
FOREGROUND_SERVICE_TYPE_CAMERA
런타임 기본 요건

CAMERA 런타임 권한 요청 및 부여

참고: CAMERA 런타임 권한에는 사용 중 제한사항이 적용됩니다. 이러한 이유로 몇 가지 예외를 제외하고 앱이 백그라운드에 있는 동안에는 camera 포그라운드 서비스를 만들 수 없습니다. 자세한 내용은 사용 중 권한이 필요한 포그라운드 서비스 시작 제한사항을 참고하세요.

설명

멀티태스킹을 허용하는 영상 채팅 앱과 같이 백그라운드에서 카메라에 계속 액세스합니다.

연결된 기기

매니페스트에서 선언할 포그라운드 서비스 유형
android:foregroundServiceType
connectedDevice
매니페스트에서 선언할 권한
FOREGROUND_SERVICE_CONNECTED_DEVICE
startForeground()에 전달할 상수
FOREGROUND_SERVICE_TYPE_CONNECTED_DEVICE
런타임 기본 요건

다음 조건 중 하나 이상에 해당해야 합니다.

설명

블루투스, NFC, IR, USB 또는 네트워크 연결이 필요한 외부 기기와의 상호작용입니다.

대안

앱에서 외부 기기로 데이터를 계속 전송해야 한다면 대신 호환 기기 관리자를 사용해 보세요. 호환 기기 접속 상태 API를 사용하면 호환 기기가 범위 내에 있는 동안 앱이 계속 실행되도록 할 수 있습니다.

앱에서 블루투스 기기를 검색해야 한다면 대신 블루투스 검색 API를 사용해 보세요.

데이터 동기화

매니페스트에서 선언할 포그라운드 서비스 유형
android:foregroundServiceType
dataSync
매니페스트에서 선언할 권한
FOREGROUND_SERVICE_DATA_SYNC
startForeground()에 전달할 상수
FOREGROUND_SERVICE_TYPE_DATA_SYNC
런타임 기본 요건
없음
설명

다음과 같은 데이터 전송 작업입니다.

  • 데이터 업로드 또는 다운로드
  • 백업 및 복원 작업
  • 가져오기 또는 내보내기 작업
  • 데이터 가져오기
  • 로컬 파일 처리
  • 네트워크를 통해 기기와 클라우드 간에 데이터 전송
대안

자세한 내용은 데이터 동기화 포그라운드 서비스 대안을 참고하세요.

Health

매니페스트에서 선언할 포그라운드 서비스 유형
android:foregroundServiceType
health
매니페스트에서 선언할 권한
FOREGROUND_SERVICE_HEALTH
startForeground()에 전달할 상수
FOREGROUND_SERVICE_TYPE_HEALTH
런타임 기본 요건

다음 조건 중 하나 이상에 해당해야 합니다.

참고: BODY_SENSORS 런타임 권한에는 사용 중 제한사항이 적용됩니다. 이러한 이유로 몇 가지 예외를 제외하고 앱이 백그라운드에 있는 동안 생체 신호 센서를 사용하는 health 포그라운드 서비스는 만들 수 없습니다. 자세한 내용은 사용 중 권한이 필요한 포그라운드 서비스 시작 제한사항을 참고하세요.

설명

운동 추적기 등 피트니스 카테고리의 앱을 지원하기 위한 장기 실행 사용 사례입니다.

위치

매니페스트에서 선언할 포그라운드 서비스 유형
android:foregroundServiceType
location
매니페스트에서 선언할 수 있는 권한
FOREGROUND_SERVICE_LOCATION
startForeground()에 전달할 상수
FOREGROUND_SERVICE_TYPE_LOCATION
런타임 기본 요건

사용자가 위치 서비스를 사용 설정해야 하며 앱에 다음 런타임 권한 중 하나 이상이 부여되어야 합니다.

참고: 사용자가 위치 서비스를 사용 설정하고 런타임 권한에 대한 액세스 권한을 부여했는지 확인하려면 PermissionChecker#checkSelfPermission()를 사용하세요.

참고: 위치 런타임 권한에는 사용 중 제한사항이 적용됩니다. 따라서 ACCESS_BACKGROUND_LOCATION 런타임 권한을 부여받지 않는 한 앱이 백그라운드에 있는 동안 location 포그라운드 서비스를 만들 수 없습니다. 자세한 내용은 사용 중 권한이 필요한 포그라운드 서비스 시작에 관한 제한사항을 참고하세요.

설명

탐색 및 위치 공유와 같이 위치 액세스가 필요한 장기 실행 사용 사례

대안

사용자가 특정 위치에 도달할 때 앱을 트리거해야 한다면 대신 지오펜싱 API를 사용하는 것이 좋습니다.

미디어

매니페스트에서 선언할 포그라운드 서비스 유형
android:foregroundServiceType
mediaPlayback
매니페스트에서 선언할 권한
FOREGROUND_SERVICE_MEDIA_PLAYBACK
startForeground()에 전달할 상수
FOREGROUND_SERVICE_TYPE_MEDIA_PLAYBACK
런타임 기본 요건
없음
설명
백그라운드에서 오디오 또는 동영상을 계속 재생합니다. Android TV에서 디지털 동영상 녹화 (DVR) 기능을 지원합니다.
대안
PIP 모드를 표시하는 경우에는 PIP 모드를 사용합니다.

미디어 프로젝션

매니페스트에서 선언할 포그라운드 서비스 유형
android:foregroundServiceType
mediaProjection
매니페스트에서 선언할 권한
FOREGROUND_SERVICE_MEDIA_PROJECTION
startForeground()에 전달할 상수
FOREGROUND_SERVICE_TYPE_MEDIA_PROJECTION
런타임 기본 요건

포그라운드 서비스를 시작하기 전에 createScreenCaptureIntent() 메서드를 호출합니다. 이렇게 하면 사용자에게 권한 알림이 표시됩니다. 사용자가 권한을 부여해야 서비스를 만들 수 있습니다.

포그라운드 서비스를 만든 후 MediaProjectionManager.getMediaProjection()를 호출할 수 있습니다.

설명

MediaProjection API를 사용하여 기본이 아닌 디스플레이 또는 외부 기기에 콘텐츠를 전송합니다. 이 콘텐츠는 반드시 미디어 콘텐츠일 필요는 없습니다.

대안

미디어를 다른 기기로 스트리밍하려면 Google Cast SDK를 사용하세요.

마이크

매니페스트에서 선언할 포그라운드 서비스 유형
android:foregroundServiceType
microphone
매니페스트에서 선언할 권한
FOREGROUND_SERVICE_MICROPHONE
startForeground()에 전달할 상수
FOREGROUND_SERVICE_TYPE_MICROPHONE
런타임 기본 요건

RECORD_AUDIO 런타임 권한을 요청하고 부여받습니다.

참고: RECORD_AUDIO 런타임 권한에는 사용 중 제한사항이 적용됩니다. 이러한 이유로 몇 가지 예외를 제외하고 앱이 백그라운드에 있는 동안에는 microphone 포그라운드 서비스를 만들 수 없습니다. 자세한 내용은 사용 중 권한이 필요한 포그라운드 서비스 시작 제한사항을 참고하세요.

설명

음성 녹음기 또는 통신 앱과 같이 백그라운드에서 마이크 캡처를 계속합니다.

전화 통화

매니페스트에서 선언할 포그라운드 서비스 유형
android:foregroundServiceType
phoneCall
매니페스트에서 선언할 권한
FOREGROUND_SERVICE_PHONE_CALL
startForeground()에 전달할 상수
FOREGROUND_SERVICE_TYPE_PHONE_CALL
런타임 기본 요건

다음 조건 중 하나 이상에 해당해야 합니다.

  • 앱이 매니페스트 파일에서 MANAGE_OWN_CALLS 권한을 선언했습니다.
  • 앱이 ROLE_DIALER 역할을 통해 기본 다이얼러 앱입니다.
설명

ConnectionService API를 사용하여 진행 중인 호출을 계속합니다.

대안

전화, 영상, VoIP 통화를 이용해야 한다면 android.telecom 라이브러리를 사용해 보세요.

CallScreeningService를 사용하여 통화를 선택해 보세요.

원격 메시지

매니페스트에서 선언할 포그라운드 서비스 유형
android:foregroundServiceType
remoteMessaging
매니페스트에서 선언할 권한
FOREGROUND_SERVICE_REMOTE_MESSAGING
startForeground()에 전달할 상수
FOREGROUND_SERVICE_TYPE_REMOTE_MESSAGING
런타임 기본 요건
없음
설명
문자 메시지를 한 기기에서 다른 기기로 전송합니다. 사용자가 기기를 전환할 때 사용자의 메시지 작업의 연속성을 지원합니다.

짧은 서비스

매니페스트에서 선언할 포그라운드 서비스 유형
android:foregroundServiceType
shortService
매니페스트에서 선언할 권한
없음
startForeground()에 전달할 상수
FOREGROUND_SERVICE_TYPE_SHORT_SERVICE
런타임 기본 요건
없음
설명

중단하거나 연기할 수 없는 중요한 작업을 신속하게 완료합니다.

이 유형에는 몇 가지 고유한 특성이 있습니다.

  • 짧은 기간(약 3분) 동안만 실행할 수 있습니다.
  • 고정 포그라운드 서비스는 지원되지 않습니다.
  • 다른 포그라운드 서비스는 시작할 수 없습니다.
  • 유형별 권한은 필요하지 않지만 FOREGROUND_SERVICE 권한은 필요합니다.
  • shortService는 앱이 현재 새로운 포그라운드 서비스를 시작할 수 있는 경우에만 다른 서비스 유형으로 변경할 수 있습니다.
  • 포그라운드 서비스는 언제든지 shortService로 유형을 변경할 수 있으며 이 시점부터 제한 시간이 시작됩니다.

shortService의 제한 시간은 Service.startForeground()가 호출되는 시점부터 시작됩니다. 앱은 제한 시간이 발생하기 전에 Service.stopSelf() 또는 Service.stopForeground()를 호출해야 합니다. 그러지 않으면 새 Service.onTimeout()이 호출되어 앱이 stopSelf() 또는 stopForeground()를 호출하여 서비스를 중지할 수 있는 짧은 기회를 제공합니다.

Service.onTimeout()이 호출되고 잠시 후에 앱이 캐시된 상태가 되고 사용자가 앱과 활발하게 상호작용하지 않는 한 더 이상 포그라운드에 있는 것으로 간주되지 않습니다. 앱이 캐시되고 서비스가 중지되지 않은 잠시 후에 앱이 ANR을 수신합니다. ANR 메시지에서 FOREGROUND_SERVICE_TYPE_SHORT_SERVICE를 언급합니다. 이러한 이유로 Service.onTimeout() 콜백을 구현하는 것이 좋습니다.

Android 13 이하에는 Service.onTimeout() 콜백이 없습니다. 이러한 기기에서 동일한 서비스가 실행되는 경우 제한 시간과 ANR을 모두 수신하지 않습니다. 아직 Service.onTimeout() 콜백을 수신하지 않았더라도 처리 작업이 완료되는 즉시 서비스가 중지되는지 확인합니다.

shortService의 제한 시간이 준수되지 않으면 앱에 유효한 다른 포그라운드 서비스나 다른 앱 수명 주기 프로세스가 실행 중이더라도 ANR이 발생한다는 점에 유의해야 합니다.

앱이 사용자에게 표시되거나 포그라운드 서비스가 백그라운드에서 시작되도록 허용하는 예외 중 하나를 충족하는 경우 FOREGROUND_SERVICE_TYPE_SHORT_SERVICE 매개변수로 Service.StartForeground()를 다시 호출하면 제한 시간이 3분 더 연장됩니다. 앱이 사용자에게 표시되지 않고 예외 중 하나를 충족하지 않는 경우 유형과 관계없이 다른 포그라운드 서비스를 시작하려고 하면 ForegroundServiceStartNotAllowedException이 발생합니다.

사용자가 앱의 배터리 최적화를 사용 중지해도 shortService FGS의 제한 시간에 영향을 받습니다.

shortService 유형과 다른 포그라운드 서비스 유형이 포함된 포그라운드 서비스를 시작하면 시스템에서 shortService 유형 선언을 무시합니다. 하지만 서비스는 여전히 선언된 다른 유형의 기본 요건을 준수해야 합니다. 자세한 내용은 포그라운드 서비스 문서를 참고하세요.

특수 용도

매니페스트에서 선언할 포그라운드 서비스 유형
android:foregroundServiceType
specialUse
매니페스트에서 선언할 권한
FOREGROUND_SERVICE_SPECIAL_USE
startForeground()에 전달할 상수
FOREGROUND_SERVICE_TYPE_SPECIAL_USE
런타임 기본 요건
없음
설명

다른 포그라운드 서비스 유형에서 다루지 않는 유효한 포그라운드 서비스 사용 사례를 다룹니다.

개발자는 FOREGROUND_SERVICE_TYPE_SPECIAL_USE 포그라운드 서비스 유형을 선언하는 것 외에도 매니페스트에서 사용 사례를 선언해야 합니다. 이렇게 하려면 <service> 요소 내에서 <property> 요소를 지정해야 합니다. 이러한 값과 해당 사용 사례는 Google Play Console에서 앱을 제출할 때 검토됩니다. 제공하는 사용 사례는 자유 형식이므로 검토자가 specialUse 유형을 사용해야 하는 이유를 알 수 있도록 충분한 정보를 제공해야 합니다.

<service android:name="fooService" android:foregroundServiceType="specialUse">
  <property android:name="android.app.PROPERTY_SPECIAL_USE_FGS_SUBTYPE"
      android:value="explanation_for_special_use"/>
</service>

시스템 제외됨

매니페스트에서 선언할 포그라운드 서비스 유형
android:foregroundServiceType
systemExempted
매니페스트에서 선언할 권한
FOREGROUND_SERVICE_SYSTEM_EXEMPTED
startForeground()에 전달할 상수
FOREGROUND_SERVICE_TYPE_SYSTEM_EXEMPTED
런타임 기본 요건
없음
설명

포그라운드 서비스를 계속 사용하기 위해 시스템 애플리케이션 및 특정 시스템 통합을 위해 예약됩니다.

이 유형을 사용하려면 앱이 다음 기준 중 하나 이상을 충족해야 합니다.

포그라운드 서비스 유형 사용에 관한 Google Play 정책 시행

앱이 Android 14 이상을 타겟팅한다면 Play Console의 앱 콘텐츠 페이지 (정책 > 앱 콘텐츠)에서 앱의 포그라운드 서비스 유형을 선언해야 합니다. Play Console에서 포그라운드 서비스 유형을 선언하는 방법에 관한 자세한 내용은 포그라운드 서비스 및 전체 화면 인텐트 요구사항 이해를 참고하세요.