Android 14 변경사항, ForegroundServiceType 꼭 입력해야 함
Android 14의 변경사항으로, foreground service를 AndroidManifest에 선언할 때, android:foregroundServiceType
항목을 필수로 명시하도록 변경되었습니다.
<service
android:name=".MyMediaPlaybackService"
android:foregroundServiceType="mediaPlayback"
android:exported="false">
</service>
foregroundServiceType
속성은 Android 10에서 추가되었지만, 필수로 입력해야하는 항목은 아니였습니다.
하지만, Android 14에서 Target SDK API가 14인 앱은 이 항목을 꼭 입력해야 합니다. 만약 입력하지 않으면 startForeground()
를 호출하여 서비스를 실행시킬 때 MissingForegroundServiceTypeException
가 발생하여 동작이 되지 않습니다.
1. 서비스 타입 종류
android:foregroundServiceType
에 입력할 수 있는 타입은 아래와 같습니다. health, remoteMessaging, shortService, specialUse, systemExempted 타입은 Android 14에서 신규로 추가되었습니다. 앱의 타입과 맞지 않으면, 구글은 foreground 서비스 대신에 WorkManager나 JobService를 사용하는 것을 권장하고 있습니다.
서비스 타입 종류
- camera
- connectedDevice
- dataSync
- health
- location
- mediaPlayback
- mediaProjection
- microphone
- phoneCall
- remoteMessaging
- shortService
- specialUse
- systemExempted
2. Foreground 서비스 실행을 위한 새로운 권한
각각의 foreground 서비스 타입으로 foreground 서비스를 실행시키려면 필요한 권한이 있습니다.
- camera:
FOREGROUND_SERVICE_CAMERA
- connectedDevice:
FOREGROUND_SERVICE_CONNECTED_DEVICE
- dataSync:
FOREGROUND_SERVICE_DATA_SYNC
- health:
FOREGROUND_SERVICE_HEALTH
- location:
FOREGROUND_SERVICE_LOCATION
- mediaPlayback:
FOREGROUND_SERVICE_MEDIA_PLAYBACK
- mediaProjection:
FOREGROUND_SERVICE_MEDIA_PROJECTION
- microphone:
FOREGROUND_SERVICE_MICROPHONE
- phoneCall:
FOREGROUND_SERVICE_PHONE_CALL
- remoteMessaging:
FOREGROUND_SERVICE_REMOTE_MESSAGING
- shortService: 필요 권한 없음
- specialUse:
FOREGROUND_SERVICE_SPECIAL_USE
- systemExempted:
FOREGROUND_SERVICE_SYSTEM_EXEMPTED
예를 들어, mediaPlayback
타입은 아래와 같이 FOREGROUND_SERVICE_MEDIA_PLAYBACK
권한을 추가로 선언해야 합니다.
<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 Developer - Intended use cases and enforcement for each foreground service type를 참고해주세요.
3. Foreground 서비스 실행
Foreground 서비스를 실행하려면 startForeground()
에 인자로 foreground 서비스 타입을 입력해야 합니다.
특히, 아래 3개 타입의 서비스를 실행시킬 때는 꼭 입력해야 합니다.
FOREGROUND_SERVICE_TYPE_CAMERA
FOREGROUND_SERVICE_TYPE_LOCATION
FOREGROUND_SERVICE_TYPE_MICROPHONE
Service.startForeground(0, notification, FOREGROUND_SERVICE_TYPE_LOCATION)