개발자가 사용자 대상 포그라운드 서비스를 더 잘 정의하도록 돕기 위해 Android 10에서는 <service> 요소 내에 android:foregroundServiceType 속성을 도입했습니다.
앱이 Android 14를 타겟팅하는 경우 적절한 포그라운드 서비스 유형을 지정해야 합니다. 이전 버전의 Android에서와 마찬가지로 여러 유형을 결합할 수 있습니다. 이 목록에는 선택할 수 있는 포그라운드 서비스 유형이 표시됩니다.
cameraconnectedDevicedataSynchealthlocationmediaPlaybackmediaProjectionmicrophonephoneCallremoteMessagingshortServicespecialUsesystemExempted
앱의 사용 사례가 이러한 유형과 연결되어 있지 않으면 WorkManager 또는 사용자가 시작한 데이터 전송 작업을 사용하도록 로직을 이전하는 것이 좋습니다.
health, remoteMessaging, shortService, specialUse 및 systemExempted 유형은 Android 14에 새로 도입되었습니다.
다음 코드 스니펫은 매니페스트에서 포그라운드 서비스 유형을 선언하는 예를 보여줍니다.
<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>
Android 14를 타겟팅하는 앱이 매니페스트에서 특정 서비스의 유형을 정의하지 않으면 시스템은 해당 서비스의 startForeground() 호출 시 MissingForegroundServiceTypeException을 발생시킵니다.
포그라운드 서비스 유형을 사용할 새로운 권한 선언
Android 14를 타겟팅하는 앱이 포그라운드 서비스를 사용하는 경우 앱은 Android 14에 도입된 포그라운드 서비스 유형에 따라 특정 권한을 선언해야 합니다. 이러한 권한은 이 페이지의 각 포그라운드 서비스 유형의 의도된 사용 사례 및 시행 섹션에 있는 '매니페스트 파일에서 선언해야 하는 권한' 섹션에 표시됩니다.
모든 권한은 일반 권한으로 정의되며 기본적으로 부여됩니다. 사용자는 이러한 권한을 취소할 수 없습니다.
런타임에 포그라운드 서비스 유형 포함
포그라운드 서비스를 시작하는 애플리케이션에 관한 권장사항은 포그라운드 서비스 유형의 비트 정수를 전달하는 startForeground()의 ServiceCompat 버전 (androidx-core 1.12 이상에서 사용 가능)을 사용하는 것입니다. 하나 이상의 유형 값을 전달하도록 선택할 수 있습니다.
일반적으로 특정 사용 사례에 필요한 유형만 선언해야 합니다. 이렇게 하면 각 포그라운드 서비스 유형에 관한 시스템의 기대치를 더 쉽게 충족할 수 있습니다. 포그라운드 서비스가 여러 유형으로 시작된 경우 포그라운드 서비스는 모든 유형의 플랫폼 시행 요구사항을 준수해야 합니다.
ServiceCompat.startForeground(0, notification, FOREGROUND_SERVICE_TYPE_LOCATION)
포그라운드 서비스 유형이 호출에서 지정되지 않으면 유형이 매니페스트에 정의된 값으로 기본 설정됩니다. 매니페스트에서 서비스 유형을 지정하지 않으면 시스템에서 MissingForegroundServiceTypeException을 발생시킵니다.
포그라운드 서비스를 실행한 후 포그라운드 서비스에 새 권한이 필요한 경우 startForeground()를 다시 호출하고 새 서비스 유형을 추가해야 합니다. 예를 들어 피트니스 앱이 항상 location 정보가 필요하지만 media 권한이 필요하지 않을 수도 있는 달리기 추적 서비스를 실행한다고 가정해 보겠습니다. 매니페스트에서 location와 mediaPlayback를 모두 선언해야 합니다. 사용자가 달리기를 시작하고 위치만 추적하려는 경우 앱은 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:foregroundServiceTypeconnectedDevice- 在清单中声明的权限
FOREGROUND_SERVICE_CONNECTED_DEVICE- 要传递给
startForeground()的常量 FOREGROUND_SERVICE_TYPE_CONNECTED_DEVICE- 运行时前提条件
必须至少满足以下其中一个条件:
在清单中至少声明以下其中一项权限:
至少请求并被授予以下其中一项运行时权限:
- 说明
与需要蓝牙、NFC、IR、USB 或网络连接的外部设备进行互动。
- 替代方案
如果您的应用需要向外部设备持续传输数据,请考虑改用配套设备管理器。使用配套设备感知 API,可帮助您的应用在配套设备在范围内时保持运行。
如果您的应用需要扫描蓝牙设备,请考虑改用 Bluetooth Scan API。
데이터 동기화
- 매니페스트에서 선언할 포그라운드 서비스 유형
android:foregroundServiceTypedataSync- 매니페스트에서 선언할 권한
FOREGROUND_SERVICE_DATA_SYNCstartForeground()에 전달할 상수FOREGROUND_SERVICE_TYPE_DATA_SYNC- 런타임 기본 요건
- 없음
- 설명
다음과 같은 데이터 전송 작업입니다.
- 데이터 업로드 또는 다운로드
- 백업 및 복원 작업
- 가져오기 또는 내보내기 작업
- 데이터 가져오기
- 로컬 파일 처리
- 네트워크를 통해 기기와 클라우드 간에 데이터 전송
- 대안
자세한 내용은 데이터 동기화 포그라운드 서비스의 대안을 참고하세요.
Health
- 要在清单中的以下位置声明的前台服务类型
android:foregroundServiceTypehealth- 在清单中声明的权限
FOREGROUND_SERVICE_HEALTH- 要传递给
startForeground()的常量 FOREGROUND_SERVICE_TYPE_HEALTH- 运行时前提条件
必须至少满足以下其中一个条件:
在清单中声明
HIGH_SAMPLING_RATE_SENSORS权限。至少请求并被授予以下其中一项运行时权限:
- 在 API 级别 35 及更低级别上使用
BODY_SENSORS READ_HEART_RATEREAD_SKIN_TEMPERATUREREAD_OXYGEN_SATURATIONACTIVITY_RECOGNITION
- 在 API 级别 35 及更低级别上使用
注意:
BODY_SENSORS和基于传感器的读取运行时权限受“在使用时”限制。因此,除非您已获得BODY_SENSORS_BACKGROUND(API 级别 33 到 35)或READ_HEALTH_DATA_IN_BACKGROUND(API 级别 36 及更高级别)权限,否则您无法创建在应用处于后台运行时使用身体传感器的health前台服务。如需了解详情,请参阅与启动需要使用时权限的前台服务相关的限制。- 说明
为健身类别的应用(例如锻炼追踪器)提供支持的所有长时间运行的用例。
위치
- 매니페스트에서 선언할 포그라운드 서비스 유형
android:foregroundServiceTypelocation- 매니페스트에서 선언할 권한
FOREGROUND_SERVICE_LOCATIONstartForeground()에 전달할 상수FOREGROUND_SERVICE_TYPE_LOCATION- 런타임 기본 요건
사용자는 위치 서비스를 사용 설정해야 하며 앱에 다음 런타임 권한 중 하나 이상이 부여되어야 합니다.
참고: 사용자가 위치 서비스를 사용 설정했는지, 런타임 권한에 대한 액세스 권한을 부여했는지 확인하려면
PermissionChecker#checkSelfPermission()를 사용하세요.참고: 위치 런타임 권한에는 사용 중 제한사항이 적용됩니다. 따라서
ACCESS_BACKGROUND_LOCATION런타임 권한이 부여되지 않은 한 앱이 백그라운드에 있는 동안location포그라운드 서비스를 만들 수 없습니다. 자세한 내용은 사용 중 권한이 필요한 포그라운드 서비스 시작에 관한 제한사항을 참고하세요.- 설명
탐색 및 위치 공유와 같이 위치 액세스가 필요한 장기 실행 사용 사례
- 대안
사용자가 특정 위치에 도달할 때 앱이 트리거되어야 하는 경우 대신 geofence API를 사용하는 것이 좋습니다.
미디어
- 매니페스트에서 선언할 포그라운드 서비스 유형
android:foregroundServiceTypemediaPlayback- 매니페스트에서 선언할 권한
FOREGROUND_SERVICE_MEDIA_PLAYBACKstartForeground()에 전달할 상수FOREGROUND_SERVICE_TYPE_MEDIA_PLAYBACK- 런타임 기본 요건
- 없음
- 설명
- 백그라운드에서 오디오 또는 동영상을 계속 재생합니다. Android TV에서 디지털 동영상 녹화 (DVR) 기능을 지원합니다.
- 대안
- PIP 동영상을 표시하는 경우 PIP 모드를 사용하세요.
미디어 프로젝션
- 要在清单中的以下位置声明的前台服务类型
android:foregroundServiceTypemediaProjection- 在清单中声明的权限
FOREGROUND_SERVICE_MEDIA_PROJECTION- 要传递给
startForeground()的常量 FOREGROUND_SERVICE_TYPE_MEDIA_PROJECTION- 运行时前提条件
在启动前台服务之前调用
createScreenCaptureIntent()方法。这样做会向用户显示权限通知;用户必须先授予权限,您才能创建服务。创建前台服务后,您可以调用
MediaProjectionManager.getMediaProjection()。- 说明
使用
MediaProjectionAPI 将内容投影到非主要显示屏或外部设备。这些内容不必全都为媒体内容。- 替代方案
如需将媒体流式传输到其他设备,请使用 Google Cast SDK。
마이크
- 要在清单中的以下位置声明的前台服务类型
android:foregroundServiceTypemicrophone- 在清单中声明的权限
FOREGROUND_SERVICE_MICROPHONE- 要传递给
startForeground()的常量 FOREGROUND_SERVICE_TYPE_MICROPHONE- 运行时前提条件
请求并获得
RECORD_AUDIO运行时权限。注意:
RECORD_AUDIO运行时权限受使用时限制的约束。因此,除少数例外情况外,您无法在应用在后台运行时创建microphone前台服务。如需了解详情,请参阅与启动需要使用时权限的前台服务相关的限制。- 说明
在后台继续捕获麦克风内容,例如录音器或通信应用。
전화 통화
- 매니페스트에서 선언할 포그라운드 서비스 유형
android:foregroundServiceTypephoneCall- 매니페스트에서 선언할 권한
FOREGROUND_SERVICE_PHONE_CALLstartForeground()에 전달할 상수FOREGROUND_SERVICE_TYPE_PHONE_CALL- 런타임 기본 요건
다음 조건 중 하나 이상에 해당해야 합니다.
- 앱이 매니페스트 파일에서
MANAGE_OWN_CALLS권한을 선언했습니다.
- 앱이 매니페스트 파일에서
- 앱이
ROLE_DIALER역할을 통해 기본 전화 앱입니다.
- 앱이
- 설명
ConnectionServiceAPI를 사용하여 진행 중인 통화를 계속합니다.- 대안
전화, 영상 또는 VoIP 통화를 해야 하는 경우
android.telecom라이브러리를 사용하는 것이 좋습니다.CallScreeningService를 사용하여 통화를 선별하는 것이 좋습니다.
원격 메시지
- 매니페스트에서 선언할 포그라운드 서비스 유형
android:foregroundServiceTyperemoteMessaging- 매니페스트에서 선언할 권한
FOREGROUND_SERVICE_REMOTE_MESSAGINGstartForeground()에 전달할 상수FOREGROUND_SERVICE_TYPE_REMOTE_MESSAGING- 런타임 기본 요건
- 없음
- 설명
- 문자 메시지를 한 기기에서 다른 기기로 전송합니다. 사용자가 기기를 전환할 때 사용자의 메시지 작업의 연속성을 지원합니다.
짧은 서비스
- 매니페스트에서 선언할 포그라운드 서비스 유형
android:foregroundServiceTypeshortService- 매니페스트에서 선언할 권한
- 없음
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:foregroundServiceTypespecialUse- 매니페스트에서 선언할 수 있는 권한
FOREGROUND_SERVICE_SPECIAL_USEstartForeground()에 전달할 상수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:foregroundServiceTypesystemExempted- 매니페스트에서 선언할 권한
FOREGROUND_SERVICE_SYSTEM_EXEMPTEDstartForeground()에 전달할 상수FOREGROUND_SERVICE_TYPE_SYSTEM_EXEMPTED- 런타임 기본 요건
- 없음
- 설명
포그라운드 서비스를 계속 사용하기 위해 시스템 애플리케이션과 특정 시스템 통합을 위해 예약됩니다.
이 유형을 사용하려면 앱이 다음 기준 중 하나 이상을 충족해야 합니다.
- 기기가 데모 모드 상태입니다.
- 앱이 기기 소유자입니다.
- 앱이 프로파일러 소유자입니다.
ROLE_EMERGENCY역할이 있는 위급 정보 앱입니다.- 기기 관리자앱입니다.
SCHEDULE_EXACT_ALARM또는USE_EXACT_ALARM권한을 보유하고 포그라운드 서비스를 사용하여 햅틱 전용 알람을 포함한 알람을 백그라운드에서 계속 실행하는 앱VPN 앱 (설정 > 네트워크 및 인터넷 > VPN을 사용하여 구성됨)
이 외의 경우에 이 유형을 선언하면 시스템에서
ForegroundServiceTypeNotAllowedException이 발생합니다.
포그라운드 서비스 유형 사용에 관한 Google Play 정책 시행
앱이 Android 14 이상을 타겟팅하는 경우 Play Console의 앱 콘텐츠 페이지 (정책 > 앱 콘텐츠)에서 앱의 포그라운드 서비스 유형을 선언해야 합니다. Play Console에서 포그라운드 서비스 유형을 선언하는 방법에 관한 자세한 내용은 포그라운드 서비스 및 전체 화면 인텐트 요구사항 이해하기를 참고하세요.