안드로이드 14(API 34)부터는 Foreground Service를 사용할 때 서비스의 목적을 명확하게 선언해야 하는 정책이 강화되었어요. 이전 버전에서는 단순히 권한을 획득하는 것만으로도 충분했지만, 이제는 어떤 종류의 작업을 수행하는지 시스템에 구체적으로 알려주는 과정이 필수적이더라고요. 이 설정을 누락하거나 서비스의 실제 동작과 맞지 않는 타입을 지정할 경우, 앱이 실행 중에 강제 종료되는 현상이 발생할 수 있어 개발 단계에서 미리 체크해야 하는 부분이에요. 특히 백그라운드에서 지속적으로 실행되어야 하는 서비스의 경우 이 설정이 매우 중요하게 작용하더라고요.

가장 먼저 해야 할 일은 `AndroidManifest.xml` 파일 내의 `<service>` 태그에 `android:foregroundServiceType` 속성을 추가하는 것이에요. 예를 들어 위치 정보를 기반으로 동작하는 서비스라면 `location` 타입을, 데이터 동기화나 파일 업로드와 같은 작업을 수행한다면 `dataSync` 타입을 지정해야 하더라고요. 각 타입에 따라 요구되는 권한이 다르기 때문에, 서비스의 목적을 정확히 파악하고 그에 맞는 타입을 매칭하는 과정이 핵심이에요. 이를 통해 시스템은 해당 서비스가 어떤 목적으로 실행되는지 판단하고 적절한 리소스를 할당할 수 있게 돼요.

<service
    android:name=".MyDataSyncService"
    android:foregroundServiceType="dataSync"
    android:exported="false">
    <intent-filter>
        <action android:name="android.intent.action.MAIN"/>
    </intent-filter>
</service>

매니페스트에 타입을 선언한 후에는 실제 코드에서도 이를 반영해야 하더라고요. `startForeground` 메서드를 호출할 때 시스템이 어떤 서비스를 실행 중인지 인식할 수 있도록 `ServiceInfo.FOREGROUND_SERVICE_TYPE_...` 상수를 포함한 플래그를 전달해야 해요. 이렇게 설정해두면 안드로이드 시스템이 해당 서비스의 생명주기를 적절하게 관리하고, 사용자에게 알림을 정확하게 전달할 수 있게 된답니다. 코드를 작성할 때 현재 타겟팅하는 API 레벨에 맞는 플래그를 정확히 넣어주는 것이 중요해요.

val notification = NotificationCompat.Builder(this, CHANNEL_ID)
    .setContentTitle("데이터 동기화 중")
    .setSmallIcon(R.drawable.ic_sync)
    .build()

// Android 14 이상에서는 타입에 맞는 플래그를 포함해야 함
startForeground(NOTIFICATION_ID, notification, ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC)

결과적으로 서비스가 수행하는 구체적인 작업에 맞는 타입을 선택하고, 그에 맞는 권한을 매니페스트에 선언하는 두 단계의 과정이 꼭 필요하더라고요. 안드로이드 14 이상을 타겟팅하는 앱이라면 배포 전에 어떤 서비스 타입을 사용하는지 다시 한번 체크해 보는 과정이 안정적인 서비스 운영에 큰 도움이 될 것 같아요. 서비스의 목적과 시스템이 요구하는 타입을 일치시키는 과정이 원활한 서비스 운영의 핵심이 될 수 있어요.

+ Recent posts