如何在Flutter中实现每15分钟执行一次简单后台任务(跨平台且应用终止仍生效)
Flutter实现跨平台定时后台任务(每15分钟,支持应用终止状态)
1. 引入依赖
在pubspec.yaml中添加workmanager插件依赖:
dependencies: flutter: sdk: flutter workmanager: ^0.5.1 # 建议使用最新版本
执行flutter pub get完成安装。
2. Android平台配置
- 打开
android/app/src/main/AndroidManifest.xml,添加必要权限:<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> <uses-permission android:name="android.permission.WAKE_LOCK"/> <!-- Android 12+ 需要添加通知权限 --> <uses-permission android:name="android.permission.POST_NOTIFICATIONS"/> - 在
<application>标签内添加WorkManager配置,避免自动初始化冲突:<provider android:name="androidx.startup.InitializationProvider" android:authorities="${applicationId}.androidx-startup" android:exported="false" tools:node="merge"> <meta-data android:name="androidx.work.WorkManagerInitializer" android:value="androidx.startup" tools:node="remove"/> </provider> <receiver android:name="com.transistorsoft.flutter.backgroundfetch.BackgroundFetchBootReceiver"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED"/> </intent-filter> </receiver>
3. iOS平台配置
- 打开
ios/Runner/Info.plist,添加后台模式权限:<key>UIBackgroundModes</key> <array> <string>fetch</string> <string>processing</string> </array> - 修改
ios/Runner/AppDelegate.swift,注册后台任务:
注意:iOS系统对后台任务管控严格,无法保证精确15分钟执行,系统会根据应用活跃度、电池状态调整间隔;如果用户手动终止应用,后台任务会停止,需重新打开应用才会恢复。import UIKit import Flutter import workmanager @UIApplicationMain @objc class AppDelegate: FlutterAppDelegate { override func application( _ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? ) -> Bool { GeneratedPluginRegistrant.register(with: self) // 注册任务标识,要和Flutter代码里的一致 WorkmanagerPlugin.registerTask(withIdentifier: "periodicTask") return super.application(application, didFinishLaunchingWithOptions: launchOptions) } }
4. Flutter核心代码实现
import 'package:flutter/material.dart'; import 'package:workmanager/workmanager.dart'; void main() { WidgetsFlutterBinding.ensureInitialized(); // 初始化WorkManager Workmanager().initialize( callbackDispatcher, isInDebugMode: false, // 调试模式可开启,查看更多日志 ); // 注册周期性任务 Workmanager().registerPeriodicTask( "periodicTask", // 任务唯一ID,不能重复 "simplePeriodicTask", // 任务名称,需和回调里的匹配 frequency: const Duration(minutes: 15), // Android端精确间隔,iOS由系统调度 initialDelay: const Duration(minutes: 1), // 首次执行延迟1分钟 constraints: Constraints( // 可选:设置任务执行条件,比如仅联网时执行 networkType: NetworkType.connected, ), ); runApp(const MyApp()); } // 后台任务回调,必须是顶层/静态函数 void callbackDispatcher() { Workmanager().executeTask((task, inputData) { switch (task) { case "simplePeriodicTask": // 这里写你的后台任务逻辑,比如请求接口、本地存储操作等 print("后台任务执行时间:${DateTime.now()}"); // 返回true表示任务成功,false会触发重试 return Future.value(true); default: return Future.value(false); } }); } class MyApp extends StatelessWidget { const MyApp({super.key}); @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( appBar: AppBar(title: const Text("后台任务示例")), body: const Center(child: Text("已注册每15分钟执行的后台任务")), ), ); } }
关键平台差异说明
- Android:应用终止后,WorkManager由系统调度,任务仍会正常执行;重启设备后,任务也会自动恢复。
- iOS:系统优先保证系统性能和电池寿命,后台任务间隔可能大于15分钟;应用被手动终止后,任务停止,需用户重新打开应用才能恢复。
内容的提问来源于stack exchange,提问作者May
相关产品推荐
相关产品推荐

