본문 바로가기
Flutter/Package

플러터에서 백그라운드 서비스를 사용한 스트림 처리[WorkManager 패키지]

by Maccrey Coding 2024. 7. 25.
728x90
반응형

 

플러터에서 백그라운드 서비스를 사용한 스트림 처리 예제를 제공하기 위해, Android의 WorkManager와 플러터의 Stream을 사용하여 구현할 수 있습니다.

예제는 다음과 같습니다:

1. 프로젝트 설정

  1. 새로운 플러터 프로젝트를 생성합니다.
  2. pubspec.yaml 파일에 필요한 패키지를 추가합니다.
dependencies:
  flutter:
    sdk: flutter
  workmanager: ^0.4.1   # 백그라운드 작업을 위한 패키지
  stream_provider: ^2.0.0

2. Android 설정

백그라운드 서비스를 위해 Android의 WorkManager를 설정합니다.

 

1. android/app/build.gradle 파일에 아래와 같이 설정을 추가합니다.

android {
    ...
    defaultConfig {
        ...
        // Ensure you have this line to enable background processing
        multiDexEnabled true
    }
}

 

2. android/app/src/main/AndroidManifest.xml 파일에 권한과 서비스를 추가합니다.

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.background_stream_example">
    <uses-permission android:name="android.permission.INTERNET"/>
    <application
        ...
        android:name=".Application">
        <service
            android:name=".MyBackgroundTask"
            android:permission="android.permission.BIND_JOB_SERVICE"
            android:exported="true"/>
        ...
    </application>
</manifest>

 

3. android/app/src/main/java/com/example/background_stream_example/Application.java 파일을 생성하고, 아래와 같이 작성합니다.

package com.example.background_stream_example;

import io.flutter.app.FlutterApplication;
import io.flutter.plugin.common.PluginRegistry;
import io.flutter.plugins.GeneratedPluginRegistrant;
import vn.hunghd.flutterdownloader.FlutterDownloaderPlugin;

public class Application extends FlutterApplication implements PluginRegistry.PluginRegistrantCallback {
    @Override
    public void onCreate() {
        super.onCreate();
    }

    @Override
    public void registerWith(PluginRegistry registry) {
        GeneratedPluginRegistrant.registerWith(registry);
    }
}

3. 플러터 코드 작성

1. lib/main.dart 파일을 생성하고 아래와 같이 작성합니다.

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

void main() {
  runApp(MyApp());
  Workmanager().initialize(callbackDispatcher, isInDebugMode: true);
  Workmanager().registerPeriodicTask(
    "1",
    "simplePeriodicTask",
    frequency: Duration(minutes: 15),
  );
}

void callbackDispatcher() {
  Workmanager().executeTask((task, inputData) {
    // 여기서 백그라운드 작업을 수행합니다.
    print("백그라운드 작업 실행");
    _MyHomePageState.incrementCounter();

    return Future.value(true);
  });
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  static StreamController<int> _controller = StreamController<int>.broadcast();
  static int _counter = 0;

  static void incrementCounter() {
    _counter++;
    _controller.add(_counter);
  }

  @override
  void dispose() {
    _controller.close();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Flutter Background Stream Example"),
      ),
      body: Center(
        child: StreamBuilder<int>(
          stream: _controller.stream,
          initialData: _counter,
          builder: (context, snapshot) {
            if (snapshot.hasData) {
              return Text(
                'Counter: ${snapshot.data}',
                style: TextStyle(fontSize: 24),
              );
            } else {
              return CircularProgressIndicator();
            }
          },
        ),
      ),
    );
  }
}

설명

  1. Workmanager 패키지를 초기화하고 주기적으로 백그라운드 작업을 등록합니다.
  2. callbackDispatcher 함수에서 백그라운드 작업을 정의합니다.
  3. MyHomePage 위젯에서 StreamBuilder를 사용하여 스트림을 처리하고, 스트림에 업데이트된 데이터를 표시합니다.
  4. incrementCounter 메서드는 백그라운드 작업이 실행될 때마다 호출되어 카운터 값을 증가시키고, 이를 스트림에 추가합니다.

이렇게 하면 플러터 앱에서 백그라운드 작업을 통해 스트림을 처리할 수 있습니다.

백그라운드 작업이 주기적으로 실행되면서 스트림을 통해 UI에 업데이트된 데이터를 표시합니다.

728x90
반응형