You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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,注册后台任务:
    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)
      }
    }
    
    注意:iOS系统对后台任务管控严格,无法保证精确15分钟执行,系统会根据应用活跃度、电池状态调整间隔;如果用户手动终止应用,后台任务会停止,需重新打开应用才会恢复。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 10:24:46