Android 14 (API 수준 34)부터는 각 포그라운드 서비스에 적절한 서비스 유형을 선언해야 합니다. 즉, 앱 매니페스트에서 서비스 유형을 선언하고 FOREGROUND_SERVICE
권한을 요청하는 것 외에도 해당 유형에 적절한 포그라운드 서비스 권한을 요청해야 합니다. 또한 포그라운드 서비스 유형에 따라 서비스를 실행하기 전에 런타임 권한을 요청해야 할 수도 있습니다.
카메라
android:foregroundServiceType
아래 매니페스트에서 선언할 포그라운드 서비스 유형camera
- 매니페스트에서 선언할 권한
FOREGROUND_SERVICE_CAMERA
startForeground()
에 전달할 상수FOREGROUND_SERVICE_TYPE_CAMERA
- 런타임 기본 요건
CAMERA
런타임 권한을 요청하고 부여받음- 설명
멀티태스킹을 허용하는 영상 채팅 앱과 같이 백그라운드에서 카메라에 계속 액세스합니다.
연결된 기기
- 매니페스트에서 선언할 포그라운드 서비스 유형
android:foregroundServiceType
connectedDevice
- 매니페스트에서 선언할 권한
FOREGROUND_SERVICE_CONNECTED_DEVICE
startForeground()
에 전달할 상수FOREGROUND_SERVICE_TYPE_CONNECTED_DEVICE
- 런타임 기본 요건
다음 조건 중 하나 이상에 해당해야 합니다.
매니페스트에서 다음 권한 중 하나 이상을 선언합니다.
다음 런타임 권한 중 하나 이상을 요청하고 부여받습니다.
UsbManager.requestPermission()
을 호출합니다.
- 설명
블루투스, 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
- 런타임 기본 요건
다음 조건 중 하나 이상에 해당해야 합니다.
매니페스트에서
HIGH_SAMPLING_RATE_SENSORS
권한을 선언합니다.다음 런타임 권한 중 하나 이상을 요청하고 부여받습니다.
- 설명
운동 추적기 등 피트니스 카테고리의 앱을 지원하기 위한 장기 실행 사용 사례입니다.
위치
- Foreground service type to declare in manifest under
android:foregroundServiceType
location
- Permission to declare in your manifest
FOREGROUND_SERVICE_LOCATION
- Constant to pass to
startForeground()
FOREGROUND_SERVICE_TYPE_LOCATION
- Runtime prerequisites
The user must have enabled location services and the app must be granted at least one of the following runtime permissions:
- Description
Long-running use cases that require location access, such as navigation and location sharing.
- Alternatives
If your app needs to be triggered when the user reaches specific locations, consider using the geofence API instead.
미디어
- 매니페스트에서 선언할 포그라운드 서비스 유형
android:foregroundServiceType
mediaPlayback
- 매니페스트에서 선언할 권한
FOREGROUND_SERVICE_MEDIA_PLAYBACK
startForeground()
에 전달할 상수FOREGROUND_SERVICE_TYPE_MEDIA_PLAYBACK
- 런타임 기본 요건
- 없음
- 설명
백그라운드에서 오디오 또는 동영상을 계속 재생합니다. Android TV에서 디지털 동영상 녹화 (DVR) 기능을 지원합니다.
- 대안
PIP 동영상을 표시하는 경우 PIP 모드를 사용하세요.
미디어 처리 중
- 매니페스트에서 선언할 포그라운드 서비스 유형
android:foregroundServiceType
mediaProcessing
- 매니페스트에서 선언할 권한
FOREGROUND_SERVICE_MEDIA_PROCESSING
startForeground()
에 전달할 상수FOREGROUND_SERVICE_TYPE_MEDIA_PROCESSING
- 런타임 기본 요건
- 없음
- 설명
미디어를 다른 형식으로 변환하는 등 미디어 애셋에서 시간이 많이 걸리는 작업을 실행하는 서비스 시스템에서 이 서비스의 실행 시간을 제한합니다. 일반적으로 이 시간 제한은 24시간 중 6시간입니다. (이 한도는 앱의 모든
mediaProcessing
포그라운드 서비스에서 공유됩니다.)앱은 다음 시나리오에서 미디어 처리 서비스를 수동으로 중지해야 합니다.
- 트랜스코딩 작업이 완료되거나 실패 상태에 도달하면 서비스가
Service.stopForeground()
및Service.stopSelf()
를 호출하여 서비스를 완전히 중지하도록 합니다.
- 트랜스코딩 작업이 완료되거나 실패 상태에 도달하면 서비스가
제한 시간에 도달하면 시스템은 서비스의
Service.onTimeout(int, int)
메서드를 호출합니다. 이때 서비스는Service.stopSelf()
를 호출할 수 있는 몇 초 정도 걸립니다. 서비스에서Service.stopSelf()
를 호출하지 않으면 '<fgs_type>의 포그라운드 서비스가 제한 시간 내에 중지되지 않았습니다. <component_name>' 오류 메시지와 함께 ANR이 발생합니다.참고:
Service.onTimeout(int, int)
는 Android 14 이하에서 사용할 수 없습니다. 이러한 버전을 실행하는 기기에서 미디어 처리 서비스가 제한 시간에 도달하면 시스템은 즉시 앱을 캐시합니다. 따라서 앱은 시간 제한 알림을 받을 때까지 기다리면 안 됩니다. 대신, 즉시 포그라운드 서비스를 종료하거나 백그라운드 서비스로 변경해야 합니다.
미디어 프로젝션
- 매니페스트에서 선언할 포그라운드 서비스 유형
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
런타임 권한을 요청하고 부여받습니다.- 설명
음성 녹음기 또는 통신 앱과 같이 백그라운드에서 마이크 캡처를 계속합니다.
전화 통화
- 매니페스트에서 선언할 포그라운드 서비스 유형
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
- 런타임 기본 요건
- 없음
- 설명
포그라운드 서비스를 계속 사용하기 위해 시스템 애플리케이션 및 특정 시스템 통합을 위해 예약됩니다.
이 유형을 사용하려면 앱이 다음 기준 중 하나 이상을 충족해야 합니다.
- 기기가 데모 모드 상태입니다.
- 앱이 기기 소유자입니다.
- 앱이 프로파일러 소유자입니다.
ROLE_EMERGENCY
역할이 있는 위급 정보 앱입니다.- 기기 관리자앱입니다.
SCHEDULE_EXACT_ALARM
또는USE_EXACT_ALARM
권한을 보유한 앱VPN 앱 (설정 > 네트워크 및 인터넷 > VPN을 사용하여 구성됨)
이 외의 경우에 이 유형을 선언하면 시스템에서
ForegroundServiceTypeNotAllowedException
이 발생합니다.
포그라운드 서비스 유형 사용에 관한 Google Play 정책 시행
앱이 Android 14 이상을 타겟팅하는 경우 Play Console의 앱 콘텐츠 페이지 (정책 > 앱 콘텐츠)에서 앱의 포그라운드 서비스 유형을 선언해야 합니다. Play Console에서 포그라운드 서비스 유형을 선언하는 방법에 관한 자세한 내용은 포그라운드 서비스 및 전체 화면 인텐트 요구사항 이해하기를 참고하세요.