본문 바로가기
Flutter/Package

플러터에서 WorkManager와 flutter_foreground_task 조합하여 배경 작업 관리하기

by Maccrey Coding 2025. 2. 14.
반응형

Flutter에서 백그라운드 작업을 실행하려면 flutter_foreground_task 패키지를 사용하여 foreground service를 설정할 수 있습니다.

그러나 앱이 종료된 후에도 지속적으로 작업을 실행해야 하는 경우, WorkManager와 같은 다른 패키지와의 조합이 필요합니다.

이번 글에서는 flutter_foreground_task와 WorkManager를 결합하여 앱이 종료되었을 때도 백그라운드 작업을 관리하는 방법을 설명하겠습니다.

1. WorkManager 패키지 설치하기

WorkManager는 Flutter에서 백그라운드 작업을 처리하는 강력한 라이브러리입니다.

주로 앱이 종료된 후에도 백그라운드에서 일정한 간격으로 작업을 실행할 수 있도록 도와줍니다.

먼저 pubspec.yaml에 workmanager 패키지를 추가합니다.

dependencies:
  flutter:
    sdk: flutter
  workmanager: ^2.0.0
  flutter_foreground_task: ^1.0.0

패키지를 설치하려면 flutter pub get 명령어를 실행하세요.

2. WorkManager 설정하기

workmanager를 사용하기 위해 먼저 앱 초기화 단계에서 설정을 해줘야 합니다. Flutter 앱의 main.dart에서 초기화 코드를 추가합니다.

import 'package:flutter/material.dart';
import 'package:workmanager/workmanager.dart';
import 'package:flutter_foreground_task/flutter_foreground_task.dart';

// 백그라운드 작업 정의
void backgroundTask() {
  print('WorkManager 백그라운드 작업 실행');
  FlutterForegroundTask.updateNotification(
    notificationTitle: 'Background Task',
    notificationText: '작업이 백그라운드에서 실행되고 있습니다...',
  );
}

void callbackDispatcher() {
  Workmanager().executeTask((task, inputData) {
    backgroundTask(); // 백그라운드 작업 실행
    return Future.value(true);
  });
}

void main() {
  runApp(MyApp());

  // WorkManager 초기화
  Workmanager().initialize(callbackDispatcher);
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: ForegroundTaskPage(),
    );
  }
}

class ForegroundTaskPage extends StatefulWidget {
  @override
  _ForegroundTaskPageState createState() => _ForegroundTaskPageState();
}

class _ForegroundTaskPageState extends State<ForegroundTaskPage> {
  @override
  void initState() {
    super.initState();
    _startForegroundTask();
    _startWorkManagerTask();
  }

  // Foreground Service 시작
  void _startForegroundTask() async {
    bool isRunning = await FlutterForegroundTask.isRunningService;
    if (!isRunning) {
      await FlutterForegroundTask.start(
        notificationTitle: 'Foreground Service',
        notificationText: '서비스가 실행 중입니다...',
        callback: _backgroundTask, // 백그라운드 작업
      );
    }
  }

  // 백그라운드 작업
  void _backgroundTask() {
    FlutterForegroundTask.updateNotification(
      notificationTitle: '실행 중',
      notificationText: '백그라운드에서 작업이 진행되고 있습니다...',
    );
  }

  // WorkManager 작업 시작
  void _startWorkManagerTask() {
    Workmanager().registerOneTimeTask(
      'id_unique_task',
      'simpleTask',
      initialDelay: Duration(seconds: 5), // 작업 시작 지연 시간
      inputData: <String, dynamic>{'key': 'value'},
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text("Foreground Service + WorkManager")),
      body: Center(
        child: ElevatedButton(
          onPressed: () async {
            await FlutterForegroundTask.stop();
            Workmanager().cancelAll();
          },
          child: Text("종료"),
        ),
      ),
    );
  }
}

코드 설명

  1. WorkManager 초기화: Workmanager().initialize(callbackDispatcher);를 사용하여 앱 시작 시 WorkManager를 초기화합니다. callbackDispatcher는 백그라운드 작업을 실행하는 함수로, WorkManager가 작업을 트리거할 때 호출됩니다.

  2. 백그라운드 작업 실행: Workmanager().executeTask()로 실제 백그라운드 작업을 실행합니다. 여기서 backgroundTask()는 실제 작업을 처리하는 함수입니다.

  3. foreground service와의 결합: _startForegroundTask()와 _backgroundTask() 함수는 foreground service를 설정하고, 해당 작업을 계속 실행할 수 있게 합니다.
    이 코드에서는 flutter_foreground_task를 사용하여 foreground 알림을 업데이트하며, WorkManager는 앱이 종료된 후에도 백그라운드에서 작업을 지속적으로 실행할 수 있도록 합니다.

  4. WorkManager 작업 등록: Workmanager().registerOneTimeTask()를 사용하여 단기적인 백그라운드 작업을 등록합니다.
    이 작업은 지정된 시간 후에 실행됩니다.

3. 앱 종료 후에도 작업 실행

앱이 종료된 후에도 백그라운드 작업을 실행하려면 WorkManagerflutter_foreground_task의 조합을 활용해야 합니다. flutter_foreground_task는 foreground에서 서비스가 실행되는 동안 작업을 계속 수행하도록 해주고, WorkManager는 앱이 종료된 후에도 주기적으로 또는 조건에 맞게 작업을 실행할 수 있습니다.

  • WorkManager는 앱 종료 후에도 지정된 시간에 작업을 트리거합니다.
  • flutter_foreground_task는 앱이 실행 중일 때만 foreground 작업을 관리합니다.

따라서 이 두 가지를 결합하여 앱이 실행 중일 때는 foreground service로 작업을 처리하고, 앱이 종료된 후에도 WorkManager를 사용하여 백그라운드 작업을 지속적으로 관리할 수 있습니다.

4. 추가적인 사용 예시

  • 백그라운드에서 GPS 추적: GPS 위치를 추적하는 앱에서, flutter_foreground_task는 위치 추적을 위해 foreground 서비스를 유지하고, WorkManager는 위치 데이터를 주기적으로 서버에 업로드하는 작업을 처리할 수 있습니다.

  • 파일 다운로드: 파일 다운로드와 같은 시간이 오래 걸리는 작업을 백그라운드에서 계속 실행할 수 있도록 하며, 다운로드 상태를 foreground service를 통해 사용자에게 알릴 수 있습니다.

이번 글에서는 flutter_foreground_taskWorkManager를 결합하여 Flutter에서 효율적으로 백그라운드 작업을 관리하는 방법을 설명했습니다.
두 패키지를 결합하면, 앱이 종료된 후에도 백그라운드 작업을 실행할 수 있으며, 앱이 실행 중일 때는 foreground service로 작업을 계속 유지할 수 있습니다.

 

이 방법을 사용하면 GPS 추적, 파일 다운로드, 주기적인 데이터 동기화 등 다양한 백그라운드 작업을 효과적으로 관리할 수 있습니다.

구독!! 공감과 댓글,

광고 클릭은 저에게 큰 힘이 됩니다.

 

Starting Google Play App Distribution! "Tester Share" for Recruiting 20 Testers for a Closed Test.

 

Tester Share [테스터쉐어] - Google Play 앱

Tester Share로 Google Play 앱 등록을 단순화하세요.

play.google.com

 

반응형