Flutter Foreground Service 완벽 구현 가이드 | 백그라운드 작업 5분 안에 배우기






Flutter Foreground Service 완벽 구현 가이드 | 5분 안에 배우기


목차

  1. Foreground Service란 무엇인가요?
  2. 왜 Foreground Service를 써야 할까요?
  3. 설정 및 준비 단계
  4. 구현 방법 상세 가이드
  5. 알림(Notification) 커스터마이징
  6. 고급 기능 활용하기
  7. 자주 묻는 질문과 해결법

Foreground Service란 무엇인가요?

Foreground Service는 Android 운영체제에서 제공하는 기능으로, 앱이 백그라운드에 있을 때도 계속해서 중요한 작업을 실행할 수 있도록 해줍니다. 가장 큰 특징은 항상 눈에 띄는 알림(notification)을 화면에 표시해야 한다는 점입니다.

사용자가 앱을 종료하거나 다른 앱으로 전환했을 때도, Foreground Service는 GPS 위치 추적, 음악 재생, 파일 다운로드, 데이터 동기화 등의 작업을 계속 수행합니다. 이는 일반 백그라운드 서비스와 다르게 시스템에서 강제로 종료되지 않는 보장을 받습니다.

일반 백그라운드 서비스와의 차이점

일반 백그라운드 서비스는 메모리가 부족할 때 시스템이 언제든지 강제로 종료시킬 수 있습니다. 반면 Foreground Service는 항상 우선순위가 높아서 시스템에서 쉽게 종료하지 않습니다. 대신 사용자에게 반드시 시각적 알림을 표시해야 하는 의무가 있죠.

💡 팁: Foreground Service는 사용자가 인지할 수 있는 작업에만 사용하세요. 몰래 작업을 하거나 사용자를 속이는 데 사용하면 앱스토어 심사 거절이나 사용자 신뢰 상실로 이어질 수 있습니다.


왜 Foreground Service를 써야 할까요?

실제 사용 사례들

Foreground Service는 여러 현실적인 상황에서 매우 유용합니다:

  • 지도 네비게이션 – 운전 중에도 경로 안내를 계속 받아야 합니다
  • 음악 플레이어 – 앱을 닫아도 음악이 계속 재생되어야 합니다
  • 실시간 위치 추적 – 택시, 배달 앱처럼 지속적인 위치 업데이트가 필요합니다
  • 대용량 파일 다운로드 – 장시간 다운로드를 안정적으로 진행해야 합니다
  • IoT 기기 연결 – 블루투스나 와이파이 기기와 지속적인 연결 유지

이런 작업들은 앱이 보이지 않는 상황에서도 반드시 계속 실행되어야 합니다. 그래서 Foreground Service가 필수적인 것이죠.

Android 시스템과의 약속

Android 운영체제는 메모리 관리를 위해 백그라운드 앱들을 자주 종료합니다. 하지만 Foreground Service를 사용하면 시스템이 “이 앱은 중요한 일을 하고 있으니 종료하지 말아달라”는 신호를 보내는 것입니다. 대신 사용자에게 투명하게 알림으로 알려야 한다는 책임이 따릅니다.


설정 및 준비 단계

1단계: 의존성 추가

가장 먼저 pubspec.yaml 파일에 Flutter Foreground Task 패키지를 추가해야 합니다. 이 패키지는 Android와 iOS에서 네이티브 Foreground Service 기능을 쉽게 사용할 수 있도록 도와줍니다.

dependencies:
  flutter_foreground_task: ^6.1.2

설정 파일에 추가한 후 터미널에서 flutter pub get 명령어를 실행하여 패키지를 다운로드합니다.

2단계: Android 권한 설정

Android 시스템에서 Foreground Service를 사용하려면 반드시 권한을 선언해야 합니다. android/app/src/main/AndroidManifest.xml 파일을 열어 다음과 같은 권한을 추가하세요.

<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />

만약 위치 추적이 필요한 경우라면 추가로 다음 권한도 필요합니다:

<uses-permission android:name="android.permission.FOREGROUND_SERVICE_LOCATION" />

이 외에도 알림 표시 권한(POST_NOTIFICATIONS)도 필수입니다:

<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />

3단계: 서비스 선언

AndroidManifest.xml의 <application> 태그 내부에 서비스를 선언해야 합니다. 이렇게 하면 Android 시스템이 앱의 Foreground Service를 인식하게 됩니다.

<service 
    android:name=".service.LocationService" 
    android:enabled="true"
    android:exported="false" 
    android:foregroundServiceType="location" />

foregroundServiceType 속성은 어떤 종류의 작업을 할 것인지 명시합니다. 위치 추적이면 location, 데이터 동기화면 dataSync 등으로 설정합니다.

4단계: 부트 완료 후 자동 시작 설정 (선택사항)

기기가 재부팅된 후에도 서비스를 자동으로 시작하고 싶다면 Broadcast Receiver를 추가할 수 있습니다:

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

그리고 manifest 파일에 다음을 추가합니다:

<receiver 
    android:name=".broadcast_receiver.RestartServiceBroadcastReceiver"
    android:enabled="true" 
    android:exported="false">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
    </intent-filter>
</receiver>

구현 방법 상세 가이드

핵심 구조 이해하기

Flutter에서 Foreground Service를 구현할 때는 몇 가지 중요한 개념을 이해해야 합니다:

  • Entry Point – 서비스가 시작될 때 실행할 함수
  • TaskHandler – 백그라운드에서 실행될 작업들을 정의하는 클래스
  • Isolate – 메인 앱과 독립적으로 실행되는 별도의 스레드
  • Notification – 사용자에게 보여줄 항상 표시되는 알림

서비스 초기화 설정

앱의 main.dart` 파일에서 Foreground Service를 초기화합니다. 이 단계에서 서비스가 어떻게 동작할지 기본 설정을 합니다.

먼저 서비스 설정은 여러 옵션들로 구성됩니다. 채널 ID(Channel ID)는 알림을 식별하는 고유한 이름입니다. 같은 채널 ID로 보내진 알림들은 같은 그룹으로 취급됩니다.

채널 이름(Channel Name)은 사용자에게 보이는 알림의 카테고리 이름입니다. 채널 설명(Channel Description)은 그 알림에 대한 자세한 설명을 제공합니다.

onlyAlertOnce 옵션을 true로 설정하면 같은 알림이 업데이트될 때 진동이나 소리가 반복되지 않습니다.

이벤트 액션 설정

ForegroundTaskEventAction은 백그라운드 작업이 얼마나 자주 실행될지 결정합니다. repeat(5000)이라고 설정하면 5초마다 작업이 반복 실행됩니다.

autoRunOnBoot를 true로 설정하면 기기 부팅 후 자동으로 서비스가 시작됩니다.

autoRunOnMyPackageReplaced는 앱이 업데이트될 때 서비스를 자동으로 다시 시작할지 결정합니다.

allowWakeLock은 기기 화면이 꺼져 있어도 CPU를 깨워서 작업을 계속하도록 합니다. 이 옵션은 배터리를 많이 소비하므로 필요한 경우에만 사용하세요.

allowWifiLock은 WiFi 연결을 유지하도록 시스템에 요청합니다.

알림 설정 상세

서비스가 시작될 때 사용자에게 보여줄 알림을 설정합니다. notificationTitle은 알림의 큰 제목이고, notificationText는 그 아래 표시되는 작은 텍스트입니다.

notificationIcon을 null로 설정하면 기본 앱 아이콘이 사용됩니다. null이 아닌 문자열을 설정하면 해당 리소스 이름의 커스텀 아이콘이 표시됩니다.

notificationButtons를 설정하면 알림에 버튼을 추가할 수 있습니다. 사용자가 알림에서 직접 특정 액션을 수행할 수 있죠. 예를 들어 음악 플레이어라면 "일시정지" 버튼을 추가할 수 있습니다.

notificationInitialRoute는 사용자가 알림을 탭했을 때 앱의 어느 페이지로 이동할지 결정합니다.

콜백 함수 처리

백그라운드에서 서비스가 실행되는 동안, 메인 앱과 데이터를 주고받기 위해 콜

댓글 남기기