Foreground Service: 개념, 유형 및 작동 메커니즘

저자: IT Sectr 게시일: 2026-03-28 읽는 시간: 11 분

Foreground Service는 상태 표시줄에 필수 알림을 표시하여 사용자에게 인식되는 장기 실행 작업을 수행하는 Android 서비스입니다. 리소스가 부족할 때 시스템이 중지할 수 있는 Background Service와 달리 Foreground Service는 높은 우선순위를 받으며 제한된 메모리 조건에서도 계속 작동합니다. Android Developers, 2025 문서에 따르면 Foreground Service는 Android 12 이상을 실행하는 기기에서 장기 실행 작업을 수행하는 유일한 신뢰할 수 있는 방법으로 남아 있습니다.

주요 내용

  • Foreground Service — 상태 표시줄에 필수 알림을 표시하여 사용자에게 표시되는 서비스
  • Notification — 필수 요소, 이것 없이는 시스템이 서비스를 시작하지 않음
  • 우선순위 — Background Service와 달리 Foreground Service는 메모리 부족 시 종료되지 않음
  • Android 12+ — 백그라운드에서 foreground service 시작에 제한 도입
  • Foreground Service Type — 대상 API 34+의 경우 서비스 유형 필수 선언

Foreground Service란

Foreground Service는 사용자가 인지하고 볼 수 있는 작업을 수행하도록 설계된 Android 구성 요소입니다. 알림 패널에 스와이프하여 제거할 수 없는 영구 알림을 표시합니다 — 서비스가 실행되는 동안 활성 상태를 유지합니다. 이것이 사용자가 인지하지 못하고 작동하는 백그라운드 서비스와의 주요 차이점입니다.

Android 시스템은 Foreground Service를 중요한 프로세스로 취급합니다. RAM이 부족하면 플랫폼은 먼저 Background Service를 종료한 다음 캐시된 Activity를 종료하고 예외적인 경우에만 Foreground Service를 종료합니다. OOM Killer는 이러한 서비스에 ADJ 레벨 2를 할당하여 강제 종료를 사실상 불가능하게 만듭니다.

Foreground Service를 시작하려면 개발자가 서비스 생성 후 몇 초 이내에 startForeground() 메서드를 호출해야 하며, 그렇지 않으면 시스템이 ForegroundServiceDidNotStartInTimeException 예외를 발생시킵니다. 이는 선언되지 않은 백그라운드 작업을 방지하기 위해 도입된 플랫폼의 엄격한 요구 사항입니다.

역사

Foreground Service 메커니즘은 Android 1.0에서 첫 번째 SDK와 함께 도입되었지만 필수 알림은 Android 9(API 28)에 나타났습니다. 그 이전에는 서비스가 사용자에게 표시되는 표시기 없이 포그라운드에서 실행될 수 있었습니다. Android 9부터 Google은 요구 사항을 강화했습니다: startForeground를 호출하는 모든 애플리케이션은 서비스 시작 후 5초 이내에 알림을 제공해야 합니다.

Android 12(API 31)에서는 백그라운드 컨텍스트에서 Foreground Service를 시작하는 데 제한이 추가되었습니다 — 이제 많은 시나리오에서 FOREGROUND_SERVICE_SPECIAL_USE 권한이 필요합니다. Android 14(API 34)는 매니페스트에서 foregroundServiceType의 필수 선언을 도입하여 서비스 아키텍처를 더 투명하고 예측 가능하게 만들었습니다.

Foreground Service 작동 방식

Foreground Service의 작동 메커니즘은 서비스 생성, 알림 바인딩 및 작업 실행의 세 가지 핵심 단계를 기반으로 합니다. 서비스는 Service 클래스에서 상속받고 onStartCommand() 메서드를 재정의하며, 여기서 식별자와 Notification 개체로 startForeground()를 호출합니다.

startForeground()를 호출한 후 시스템은 서비스 프로세스를 높은 생존 우선순위로 포그라운드 그룹으로 이동합니다. 즉, Android는 RAM 부하에 관계없이 프로세스를 계속 실행하려고 시도합니다. Foreground Service는 정상적인 조건에서 시스템에 의해 중지될 수 없습니다 — 사용자가 알림을 스와이프하여 제거하거나 명시적으로 stopSelf()를 호출하는 경우에만 가능합니다.

Foreground Service의 수명 주기는 onCreate(), onStartCommand()onDestroy() 메서드를 통해 관리됩니다. onStartCommand()에서 개발자는 프로세스 종료 후 재시작 전략을 정의합니다 — START_STICKY 상수는 리소스 복구 후 시스템이 서비스를 다시 생성하도록 강제하고 START_NOT_STICKY는 자동 재시작을 방지합니다.

수명 주기 및 상태

Foreground Service가 시작되면 순차적으로 startService() 호출, onCreate()에서 Service 개체 생성, onStartCommand()에서 Intent 처리 및 Notification 개체로 startForeground() 호출 단계가 실행됩니다. 서비스가 이미 실행 중이고 새 Intent가 도착하면 onStartCommand()만 다시 호출됩니다 — onCreate()는 서비스 수명 동안 한 번만 실행됩니다.

Foreground Service 중지는 REMOVE_NOTIFICATION 플래그와 함께 stopForeground()를 통해 이루어지며 상태 표시줄에서 알림을 숨깁니다. 알림을 제거한 직후 시스템은 서비스를 포그라운드로 간주하지 않고 우선순위를 Background Service로 낮출 수 있어 프로세스가 종료에 취약해집니다.

PowerManager와의 상호 작용

PowerManager는 Foreground Service 작동에서 중요한 역할을 합니다. Android의 절전 모드(Doze, App Standby)가 작업 실행 능력을 제한할 수 있기 때문입니다. 포그라운드 상태에 있더라도 서비스는 배터리 정책의 적용을 받습니다 — 네트워크 요청이 지연되고 타이머가 Doze 창과 동기화될 수 있습니다. 지연에 내성이 있는 장기 실행 작업의 경우 WorkManager와 함께 Foreground Service를 사용하는 것이 좋습니다.

Foreground Service의 주요 유형

Android 14(API 34)부터 Google은 매니페스트에서 Foreground Service 유형의 필수 선언을 도입했습니다. 각 유형은 허용된 사용 시나리오를 정의합니다 — 시스템은 선언된 유형과 실제 서비스 동작 간의 일치 여부를 확인합니다. 총 9가지 유형이 있지만 가장 일반적으로 사용되는 것은 다음과 같습니다.

dataSync

dataSync 유형은 장치와 서버 간의 데이터 동기화, 파일 전송 및 백업을 위해 설계되었습니다. 예로는 클라우드 스토리지에 사진 업로드, Firebase와 데이터베이스 동기화 또는 원격 서버에 로그 업로드가 있습니다. 이 유형은 속성 android:foregroundServiceType="dataSync"를 통해 매니페스트에 정당성을 지정해야 합니다.

mediaPlayback

mediaPlayback 유형은 백그라운드에서 오디오 및 비디오 재생에 사용됩니다 — 음악 플레이어, 팟캐스트 클라이언트, 비디오 플레이어. 사용자 개입 없이 무기한 실행될 수 있는 유일한 유형입니다. 알림 채널은 높은 우선순위를 가져야 하며 MediaStyle을 통해 재생 제어 버튼(재생, 일시 중지, 다음, 이전)을 표시해야 합니다.

location

location 유형은 위치 정보 서비스 — 내비게이션 앱, 활동 추적, 지오펜싱 — 용입니다. Android 14+의 경우 FOREGROUND_SERVICE_LOCATION 권한을 선언하고 매니페스트에서 유형을 지정해야 합니다. 애플리케이션은 런타임에 활성 위치 권한이 있어야 하며, 그렇지 않으면 시스템이 서비스 시작을 거부합니다.

유형권한사용 예
dataSyncFOREGROUND_SERVICE_DATA_SYNC클라우드와 파일 동기화
mediaPlaybackFOREGROUND_SERVICE_MEDIA_PLAYBACK백그라운드 음악 플레이어
locationFOREGROUND_SERVICE_LOCATION운전 중 GPS 내비게이션
cameraFOREGROUND_SERVICE_CAMERA비디오 감시 애플리케이션
connectedDeviceFOREGROUND_SERVICE_CONNECTED_DEVICEBLE 장치 작업

Foreground Service vs Background Service

핵심 차이점은 Foreground와 Background Service 사이의 표시 가능한 알림 및 생존 우선순위의 존재입니다. Background Service는 메모리가 부족할 때 시스템에 의해 언제든지 중지될 수 있지만 Foreground Service는 Android Low Memory Killer 메커니즘에서 향상된 프로세스 adj 수준 덕분에 계속 실행됩니다.

Background Service는 알림이 필요하지 않으며 사용자가 인지하지 못하고 실행될 수 있습니다. 그러나 Android 8(API 26)부터 Google은 백그라운드 서비스를 크게 제한했습니다: 백그라운드 컨텍스트에서 startService()가 더 이상 작동하지 않으며 포그라운드로 전환하려는 서비스를 시작하려면 Context.startForegroundService()가 필수가 되었습니다. 시스템은 백그라운드 실행 제한도 도입했습니다 — 타이머(현재 10분) 이후 Background Service가 강제로 중지됩니다.

반면 Foreground Service에는 시간 제한이 없습니다. 서비스는 몇 시간 또는 며칠 동안 실행될 수 있습니다 — 사용자가 명시적으로 중지하거나 장치를 재부팅할 때까지. 이로 인해 Foreground Service는 지속적인 백그라운드 작업이 필요한 애플리케이션(음악 플레이어, 활동 추적기, VoIP 통화 앱)에 최적의 선택이 됩니다.

비교 표

매개변수Foreground ServiceBackground Service
알림필수필요 없음
수명제한 없음최대 10분(API 26+)
시스템 우선순위높음(ADJ 2)낮음(ADJ 8+)
API 26+ 시작startForegroundService()백그라운드에서 금지

Android 12+ 요구 사항

Android 12(API 31)부터 Google은 Foreground Service 시작에 상당한 제한을 도입했습니다. 주요 변경 사항은 대부분의 서비스 유형에 대해 백그라운드 컨텍스트에서 startForegroundService()를 호출하는 것을 금지하는 것입니다. 예외는 사용자가 명시적으로 동의한 경우(예: FOREGROUND_SERVICE_SPECIAL_USE 권한을 통해) 또는 서비스가 BOOT_COMPLETED 브로드캐스트 인텐트에 응답하여 시작되는 경우에만 적용됩니다.

API 34+를 대상으로 하는 애플리케이션 매니페스트는 선언된 각 서비스에 대해 foregroundServiceType 블록을 포함해야 합니다. 예를 들어 데이터 동기화 서비스의 경우 android:foregroundServiceType="dataSync"를 지정합니다. 유형이 지정되지 않은 경우 시스템은 서비스를 유효하지 않은 것으로 간주하고 시작 시도 시 MissingForegroundServiceTypeException을 throw합니다. Google Play도 유형 일치를 확인하고 불일치 시 게시를 거부할 수 있습니다.

Android 14+ 권한

Android 14(API 34)에서는 각 Foreground Service 유형에 해당하는 권한이 있습니다. 개발자는 매니페스트에서 이를 선언하고 서비스를 시작하기 전에 런타임에 요청해야 합니다. dataSync에는 FOREGROUND_SERVICE_DATA_SYNC가 필요하고 mediaPlayback에는 FOREGROUND_SERVICE_MEDIA_PLAYBACK이 필요합니다. 사용자는 설정에서 권한을 취소할 수 있으며 활성 서비스가 중지됩니다.

Google은 Android 14에서 Foreground Service 알림 시간 초과 메커니즘도 도입했습니다: 서비스가 생성 후 10초 이내에 startForeground()를 호출하지 않으면 시스템이 예외를 발생시킵니다. 이 강화 조치는 알림 호출을 지연시키거나 건너뛰고 포그라운드로 위장하여 Background Service로 작동하는 애플리케이션을 방지하기 위한 것입니다.

Foreground Service 사용 사례

Foreground Service는 백그라운드에서 보장된 실행이 필요한 광범위한 작업에 사용됩니다. 가장 일반적인 시나리오에는 미디어 재생, 위치 추적, 데이터 동기화 및 주변 장치 작업이 포함됩니다. 각각을 자세히 살펴보겠습니다.

미디어 플레이어 및 오디오 스트리밍

전형적인 예는 애플리케이션을 최소화한 후에도 재생을 계속하는 음악 플레이어입니다. 서비스는 MediaStyle 알림, 제어 버튼과 함께 시작되며 mediaPlayback 유형을 사용합니다. 사용자는 상태 표시줄에서 트랙 정보를 보고 앱을 열지 않고도 재생을 제어할 수 있습니다.

GPS 추적기 및 내비게이션

내비게이션 애플리케이션은 지속적인 좌표 추적을 위해 location 유형의 Foreground Service를 사용합니다. 서비스는 현재 속도, 이동 시간 및 추적 중지 버튼이 포함된 알림을 표시합니다. Foreground Service가 없으면 시스템은 몇 분 후에 백그라운드에서 좌표 수신을 중단하여 내비게이션이 불가능해집니다.

VoIP 통화

음성 및 영상 통화 애플리케이션 — VoIP 클라이언트 — 은 활성 연결을 유지하기 위해 Foreground Service를 사용합니다. phoneCall 유형(Android 14부터)의 서비스는 애플리케이션을 최소화해도 통화가 끊어지지 않도록 보장합니다. 알림에는 통화 시간과 마이크 및 스피커 제어가 표시됩니다.

  • 미디어 플레이어 — 오디오 스트리밍, 팟캐스트, 백그라운드 포함 비디오 플레이어
  • 내비게이션 — GPS 추적, 지오펜싱, 운전용 내비게이터
  • VoIP 통화 — Skype, Zoom, Telegram — 활성 통화 유지
  • 피트니스 트래커 — 걸음 수 측정, 심박수 모니터링, 운동
  • 동기화 — 사진 업로드, 데이터 백업, 오프라인 콘텐츠 업데이트

Kotlin에서 Foreground Service 만들기

데이터 동기화를 위해 Kotlin에서 Foreground Service를 만드는 방법을 살펴보겠습니다. 서비스는 Activity에서 시작되고 진행률이 포함된 알림을 표시하며 완료 후 올바르게 종료됩니다. 예제는 매니페스트 선언, 알림 채널, startForeground() 호출 및 foregroundServiceType 처리 등 모든 필수 요소를 보여줍니다.

kotlin
class SyncService : Service() {

    companion object {
        const val CHANNEL_ID = "sync_channel"
        const val NOTIFICATION_ID = 1001
    }

    override fun onCreate() {
        super.onCreate()
        createNotificationChannel()
    }

    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
        val notification = buildNotification()
        startForeground(NOTIFICATION_ID, notification)
        performSync()
        return START_STICKY
    }

    private fun createNotificationChannel() {
        val channel = NotificationChannel(
            CHANNEL_ID,
            "동기화",
            NotificationManager.IMPORTANCE_LOW
        ).apply {
            description = "데이터 동기화 채널"
        }
        val manager = getSystemService(NotificationManager::class.java)
        manager.createNotificationChannel(channel)
    }

    private fun buildNotification(): Notification {
        return NotificationCompat.Builder(this, CHANNEL_ID)
            .setContentTitle("동기화")
            .setContentText("서버에 데이터 업로드")
            .setSmallIcon(R.drawable.ic_sync)
            .setOngoing(true)
            .build()
    }

    private fun performSync() {
        GlobalScope.launch(Dispatchers.IO) {
            // 동기화 에뮬레이션
            delay(5000)
            stopForeground(Service.STOP_FOREGROUND_REMOVE)
            stopSelf()
        }
    }

    override fun onBind(intent: Intent): IBinder? = null
}

매니페스트에서 서비스 선언

Android 12+에서 서비스가 올바르게 작동하려면 Foreground ServiceAndroidManifest.xml에 유형과 필요한 권한과 함께 선언해야 합니다. foregroundServiceType 속성은 대상 API 34+에 필수이며 FOREGROUND_SERVICE_DATA_SYNCPOST_NOTIFICATIONS 권한은 런타임에 요청해야 합니다.

xml
<!-- AndroidManifest.xml -->
<uses-permission
    android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission
    android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC" />
<uses-permission
    android:name="android.permission.POST_NOTIFICATIONS" />

<application ...>
    <service
        android:name=".SyncService"
        android:foregroundServiceType="dataSync"
        android:exported="false" />
</application>

제한 사항 및 대안

높은 신뢰성에도 불구하고 Foreground Service에는 제한 사항이 있습니다. 주요 제한은 사용자에 대한 가시성입니다. 애플리케이션은 알림 없이 백그라운드에서 장기 실행 작업을 수행할 수 없으며 UX 관점에서 항상 허용되는 것은 아닙니다. 또한 일부 유형의 시간 제한을 초과하면 시스템이 Foreground Service조차 강제로 중지할 수 있습니다 — 예를 들어 dataSync는 몇 시간의 작동으로 제한됩니다.

Foreground Service의 대안은 지연된 작업 및 백그라운드 작업을 위한 Android Jetpack 라이브러리인 WorkManager입니다. WorkManager는 장치 재부팅 후에도 작업 실행을 보장하며 작업 체인, 정기적인 작업 및 네트워크와 배터리 제약 조건을 지원합니다. 대부분의 백그라운드 작업에서 Google은 직접 서비스보다 WorkManager를 권장합니다.

JobScheduler는 작업을 예약하기 위한 Android 내장 API입니다. 지연될 수 있는 작업(Wi-Fi 동기화, 충전기 연결 시 데이터 다운로드)에 적합합니다. JobScheduler는 배터리 절약을 위해 작업을 창으로 그룹화하는 반면 Foreground Service는 절전 상태에 관계없이 지속적으로 실행됩니다.

짧은 작업(최대 10~15초)의 경우 지연 실행과 함께 WorkManager의 CoroutineWorker를 사용할 수 있습니다. 작업을 특정 시간에 엄격히 실행해야 하는 경우 BroadcastReceiver와 함께 AlarmManager를 사용합니다. 따라서 Foreground Service는 장기 지속 작업을 위한 솔루션이며 모든 백그라운드 시나리오를 위한 범용 도구가 아닙니다.

  • WorkManager — 재부팅 지원이 있는 지연 및 보장된 작업용
  • JobScheduler — 네트워크 및 배터리 상태를 고려한 작업 예약용
  • AlarmManager — 정확한 시간에 작업 실행용
  • CoroutineWorker — 코루틴 지원이 있는 짧은 백그라운드 작업용

자주 묻는 질문

Android에서 Foreground Service란 무엇인가요?

Foreground Service는 상태 표시줄에 영구 알림이 있는 Android 서비스로 사용자에게 표시되는 장기 실행 작업을 수행합니다. 높은 생존 우선순위를 가지며 Background Service와 달리 메모리 부족 시 시스템에 의해 중지되지 않습니다.

Foreground Service와 Background Service의 차이점은 무엇인가요?

Foreground Service는 필수 알림을 표시하고 시간 제한이 없으며 시스템 종료로부터 보호됩니다. Background Service는 사용자에게 보이지 않으며 최대 10분(API 26+) 동안 실행되고 언제든지 Low Memory Killer에 의해 중지될 수 있습니다.

Android 14에는 어떤 Foreground Service 유형이 있나요?

Android 14는 9가지 유형을 정의합니다: dataSync, mediaPlayback, location, camera, connectedDevice, phoneCall, microphone, healthremoteMessaging. 각 유형에는 해당 권한과 foregroundServiceType 속성을 통한 매니페스트 선언이 필요합니다.

startForeground를 제때 호출하지 않으면 어떻게 되나요?

서비스가 생성 후 10초 이내에 startForeground()를 호출하지 않으면(Android 14) 시스템이 ForegroundServiceDidNotStartInTimeException 예외를 발생시키고 서비스를 강제로 중지합니다. 작업이 메인 스레드에서 실행 중인 경우 애플리케이션은 ANR(Application Not Responding)도 수신합니다.

Foreground Service 알림을 숨길 수 있나요?

아니요, Foreground Service의 알림을 프로그래밍 방식으로 숨기는 것은 불가능합니다. Android 9(API 28)부터 알림은 필수이며 사용자가 스와이프하여 제거할 수 없습니다. 제거하는 유일한 방법은 stopForeground(REMOVE_NOTIFICATION)stopSelf()를 호출하여 서비스를 중지하는 것입니다.

요약

  • Foreground Service — 상태 표시줄에 필수 알림이 있는 Android 서비스
  • 우선순위 — Foreground Service는 사실상 시스템에 의해 종료되지 않음(ADJ 2), Background Service(ADJ 8+)와 대조적
  • 유형 — Android 14는 유형(dataSync, mediaPlayback, location 등) 및 해당 권한 선언 필요
  • 제한 — Android 12+에서 백그라운드 시작 금지; 일부 시나리오에서 FOREGROUND_SERVICE_SPECIAL_USE 필요
  • 대안 — WorkManager(지연 작업), JobScheduler(예약), AlarmManager(정확한 시간)
  • 코드 — 필수 요소: NotificationChannel, startForeground(), 매니페스트의 foregroundServiceType
  • Google Play — 앱 게시에는 선언된 유형과 실제 서비스 사용 간의 일치 필요

턴키 방식의 모바일 애플리케이션을 개발해 드립니다

IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.

프로젝트 논의

더 읽어보기