Flutter后台任务管理插件simple_work_manager的使用

发布于 1周前 作者 sinazl 来自 Flutter

Flutter后台任务管理插件simple_work_manager的使用

Simple Work Manager 是一个用于在 Android 和 iOS 上管理后台任务的插件。它映射了 Android 的 WorkManager 和 iOS 的 BGTaskScheduler。

抽象

Simple Work Manager 可以帮助开发者在后台执行重复性任务,例如数据同步、文件处理等。


开始使用

pubspec.yaml 中添加依赖

首先,在项目的 pubspec.yaml 文件中添加 simple_work_manager 依赖:

dependencies:
  simple_work_manager:

然后运行以下命令安装依赖:

flutter pub get

iOS 配置

1. 在 Info.plist 中设置允许的任务调度标识符

在 Xcode 的项目设置中,打开 Info.plist 文件,添加以下键值对:

<key>PermittedBackgroundTaskSchedulerIdentifier</key>
<string>[com].[domain].simple_work_manager.process</string>

确保字符串是唯一的,并包含你的域名标识符。

2. 启用后台模式

在 Xcode 的项目设置中,勾选 Background Modes 并选择 Background Processing

3. 注册插件

AppDelegate.swift 文件中添加以下代码:

import UIKit
import Flutter

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
  override func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
  ) -> Bool {
    GeneratedPluginRegistrant.register(with: self)
    return super.application(application, didFinishLaunchingWithOptions: launchOptions)
  }
}

导入插件

在 Dart 文件中导入插件:

import 'package:simple_work_manager/simple_work_manager.dart';

准备回调函数

定义一个顶级函数作为回调函数,该函数将在后台任务中被调用:

[@pragma](/user/pragma)("vm:entry-point")
void callbackDispatcher() {
  debugPrint("simple_work_manager: callbackDispatcher() is called at ${DateTime.now()}");
  // 在这里执行后台任务
}

实例化 SimpleWorkManager

创建一个 SimpleWorkManager 实例,并指定回调函数和回调函数标识符:

SimpleWorkManager _simpleWorkManagerPlugin;

[@override](/user/override)
void initState() {
  super.initState();
  _simpleWorkManagerPlugin =
      SimpleWorkManager(callbackFunction: callbackDispatcher, callbackFunctionIdentifier: "callbackDispatcher");
}

安排后台任务

使用 schedule 方法安排后台任务,指定 Android 和 iOS 的选项:

_simpleWorkManagerPlugin.schedule(
  AndroidOptions(
    requiresNetworkConnectivity: true, // 是否需要网络连接
    requiresExternalPower: true,      // 是否需要外部电源
    targetPeriodInMinutes: 15         // 最小任务间隔(分钟)
  ),
  IOSOptions(
    requiresNetworkConnectivity: true, // 是否需要网络连接
    requiresExternalPower: true,      // 是否需要外部电源
    taskIdentifier: "com.jimdo.uchida001tmhr.simple_work_manager.process" // 唯一的任务标识符
  )
);

注意事项

  • requiresNetworkConnectivityrequiresExternalPower 必须根据实际需求进行配置。
  • targetPeriodInMinutes 的最小值为 15 分钟。
  • taskIdentifier 必须与 Xcode 中设置的 PermittedBackgroundTaskSchedulerIdentifier 一致。

取消任务

可以通过以下方法取消已安排的任务:

_simpleWorkManagerPlugin.cancel();

约束条件的行为表

以下是 requiresNetworkConnectivityrequiresExternalPower 的行为表:

Android 表格

requiresNetworkConnectivity requiresExternalPower WiFi ON WiFi OFF
NULL NULL
NULL FALSE ×
NULL TRUE ×

iOS 表格

requiresNetworkConnectivity requiresExternalPower WiFi ON WiFi OFF
NULL NULL ×
NULL FALSE ×
NULL TRUE ×

建议的约束条件

为了持续执行后台任务,建议将 requiresExternalPowerrequiresNetworkConnectivity 设置为 true,并插入外部电源。


警告

  • 应用程序必须保持运行状态以调用回调函数。
  • 在 iOS 上,应用程序必须处于后台才能调用回调函数。

示例代码

以下是一个完整的示例代码,展示如何使用 simple_work_manager 插件:

import 'package:flutter/material.dart';
import 'package:simple_work_manager/simple_work_manager.dart';
import 'package:flutter_local_notifications/flutter_local_notifications.dart';

[@pragma](/user/pragma)("vm:entry-point")
void callbackDispatcher() {
  debugPrint("simple_work_manager: callbackDispatcher() is called at ${DateTime.now()}");
  final flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin();
  flutterLocalNotificationsPlugin
      .initialize(
        const InitializationSettings(
          android: AndroidInitializationSettings('@mipmap/ic_launcher'),
          iOS: DarwinInitializationSettings()
        )
      )
      .then((_) => flutterLocalNotificationsPlugin.show(
          0,
          'simple_work_manager',
          'debug notification',
          const NotificationDetails(
              android: AndroidNotificationDetails('simple_work_manager debug notification',
                  'simple_work_manager debug notification'))));
}

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

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  late SimpleWorkManager _simpleWorkManagerPlugin;
  int iRequiresNetworkConnectivity = 0;
  int iRequiresExternalPower = 0;

  [@override](/user/override)
  void initState() {
    super.initState();
    _simpleWorkManagerPlugin =
        SimpleWorkManager(callbackFunction: callbackDispatcher, callbackFunctionIdentifier: "callbackDispatcher");
  }

  bool? dropDownToBool(int dropDownValue) {
    switch (dropDownValue) {
      case 1:
        return false;
      case 2:
        return true;
      default:
        return null;
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    Map<int, String> dropDownMap = {0: "NULL", 1: "FALSE", 2: "TRUE"};
    return MaterialApp(
        home: Scaffold(
            appBar: AppBar(
              title: const Text("Plugin example app"),
            ),
            body: Column(children: [
              Row(children: [
                TextButton(
                    onPressed: () {
                      debugPrint("simple_work_manager: scheduled at ${DateTime.now()}");
                      _simpleWorkManagerPlugin.schedule(
                          AndroidOptions(
                              requiresNetworkConnectivity: dropDownToBool(iRequiresNetworkConnectivity),
                              requiresExternalPower: dropDownToBool(iRequiresExternalPower),
                              targetPeriodInMinutes: 15),
                          IOSOptions(
                              requiresNetworkConnectivity: dropDownToBool(iRequiresNetworkConnectivity),
                              requiresExternalPower: dropDownToBool(iRequiresExternalPower),
                              taskIdentifier: "com.jimdo.uchida001tmhr.simple_work_manager.process"));
                    },
                    child: const Text("Schedule")),
                const Spacer(),
                TextButton(
                    onPressed: () {
                      debugPrint("simple_work_manager: cancel");
                      _simpleWorkManagerPlugin.cancel();
                    },
                    child: const Text("Cancel"))
              ]),
              Row(children: [
                const Text("requiresNetworkConnectivity"),
                const Spacer(),
                DropdownButton(
                    value: iRequiresNetworkConnectivity,
                    items: [
                      for (var element in dropDownMap.entries) ...{
                        DropdownMenuItem(value: element.key, child: Text(element.value))
                      }
                    ],
                    onChanged: (value) {
                      setState(() {
                        iRequiresNetworkConnectivity = value as int;
                      });
                    })
              ]),
              Row(children: [
                const Text("requiresExternalPower"),
                const Spacer(),
                DropdownButton(
                    value: iRequiresExternalPower,
                    items: [
                      for (var element in dropDownMap.entries) ...{
                        DropdownMenuItem(value: element.key, child: Text(element.value))
                      }
                    ],
                    onChanged: (value) {
                      setState(() {
                        iRequiresExternalPower = value as int;
                      });
                    })
              ])
            ])));
  }
}

更多关于Flutter后台任务管理插件simple_work_manager的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter后台任务管理插件simple_work_manager的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


simple_work_manager 是一个用于在 Flutter 中管理后台任务的插件。它基于 Android 的 WorkManager API,允许你在后台执行任务,即使应用被关闭或设备重启。这个插件非常适合用于执行周期性任务、延迟任务或需要保证执行的任务。

安装

首先,你需要在 pubspec.yaml 文件中添加 simple_work_manager 依赖:

dependencies:
  flutter:
    sdk: flutter
  simple_work_manager: ^0.0.1

然后运行 flutter pub get 来安装依赖。

基本用法

1. 初始化

在使用 simple_work_manager 之前,你需要在应用的 main 函数中进行初始化:

import 'package:flutter/material.dart';
import 'package:simple_work_manager/simple_work_manager.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await SimpleWorkManager.initialize();
  runApp(MyApp());
}

2. 定义后台任务

你需要定义一个后台任务,这个任务将在后台执行。你可以通过继承 SimpleTask 类来实现:

import 'package:simple_work_manager/simple_work_manager.dart';

class MyTask extends SimpleTask {
  [@override](/user/override)
  Future<void> execute() async {
    // 在这里执行你的后台任务
    print("后台任务执行中...");
  }
}

3. 调度任务

你可以使用 SimpleWorkManager 来调度任务。以下是一些常见的调度方式:

  • 一次性任务
await SimpleWorkManager().enqueue(
  task: MyTask(),
  constraints: Constraints(
    networkType: NetworkType.connected,
  ),
);
  • 周期性任务
await SimpleWorkManager().enqueuePeriodic(
  task: MyTask(),
  frequency: Duration(hours: 1),
  constraints: Constraints(
    networkType: NetworkType.connected,
  ),
);
  • 延迟任务
await SimpleWorkManager().enqueueWithDelay(
  task: MyTask(),
  delay: Duration(minutes: 30),
  constraints: Constraints(
    networkType: NetworkType.connected,
  ),
);

4. 取消任务

你可以通过任务的唯一标识符来取消任务:

await SimpleWorkManager().cancelByTag("my_task_tag");

5. 监听任务状态

你可以监听任务的状态变化:

SimpleWorkManager().listenTaskStatus((status) {
  print("任务状态: $status");
});

示例

以下是一个完整的示例,展示了如何使用 simple_work_manager 来调度和执行后台任务:

import 'package:flutter/material.dart';
import 'package:simple_work_manager/simple_work_manager.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await SimpleWorkManager.initialize();
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Simple Work Manager Example'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () async {
              await SimpleWorkManager().enqueue(
                task: MyTask(),
                constraints: Constraints(
                  networkType: NetworkType.connected,
                ),
              );
            },
            child: Text('调度任务'),
          ),
        ),
      ),
    );
  }
}

class MyTask extends SimpleTask {
  [@override](/user/override)
  Future<void> execute() async {
    // 在这里执行你的后台任务
    print("后台任务执行中...");
  }
}
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!