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)