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

如何在macOS或Windows桌面端让Flutter应用在后台运行?

Flutter桌面应用后台任务实现方案(macOS/Windows)

Flutter桌面应用在macOS和Windows平台上均支持最小化/失焦状态下运行后台任务,以下分平台给出具体实现方案和示例代码:


macOS平台实现

1. 配置后台权限

首先在macos/Runner/Info.plist中添加后台模式权限,让系统允许应用在后台运行:

<key>NSBackgroundModes</key>
<array>
    <string>processing</string> <!-- 后台处理任务权限 -->
    <string>fetch</string> <!-- 后台数据获取权限 -->
</array>

2. Dart层后台任务实现

Flutter主Isolate在应用失焦时不会自动暂停,可直接通过独立Isolate或定时器执行后台任务:

import 'dart:async';
import 'dart:isolate';

void main() {
  runApp(MyApp());
  // 启动独立Isolate执行后台任务
  Isolate.spawn(runBackgroundTask, null);
}

void runBackgroundTask(dynamic message) {
  // 周期性执行任务(每10秒一次)
  Timer.periodic(const Duration(seconds: 10), (timer) {
    print("macOS后台任务运行:${DateTime.now()}");
    // 此处写入你的后台逻辑(如数据同步、文件处理等)
  });
}

3. 原生层增强(可选)

若需要系统休眠后仍能唤醒执行任务,可在macOS原生代码中使用NSBackgroundActivityScheduler:
在macos/Runner/AppDelegate.swift中添加:

import Cocoa

@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {
    private var backgroundActivity: NSBackgroundActivityScheduler?

    func applicationDidFinishLaunching(_ aNotification: Notification) {
        setupBackgroundActivity()
    }

    private func setupBackgroundActivity() {
        backgroundActivity = NSBackgroundActivityScheduler(identifier: "com.yourcompany.yourapp.background")
        backgroundActivity?.repeats = true
        backgroundActivity?.interval = 60 // 每60秒执行一次
        backgroundActivity?.qualityOfService = .utility
        backgroundActivity?.schedule { completion in
            print("macOS原生后台任务执行")
            // 执行后台逻辑
            completion(NSBackgroundActivityScheduler.Result.finished)
        }
    }
}

Windows平台实现

1. Dart层基础实现

Windows应用失焦/最小化时,Flutter Isolate默认持续运行,可直接用Isolate或定时器实现:

import 'dart:async';
import 'dart:isolate';

void main() {
  runApp(MyApp());
  // 启动后台Isolate
  Isolate.spawn(runWindowsBackgroundTask, null);
}

void runWindowsBackgroundTask(dynamic message) {
  Timer.periodic(const Duration(seconds: 10), (timer) {
    print("Windows后台任务运行:${DateTime.now()}");
    // 执行后台逻辑
  });
}

2. 原生层防止进程被挂起(可选)

若需避免系统因资源限制挂起后台应用,可通过Win32 API配置进程状态:
在windows/runner/main.cpp中修改:

#include <windows.h>
#include <processthreadsapi.h>

int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev,
                      _In_ wchar_t *command_line, _In_ int show_command) {
  // 禁用进程执行速度限制,确保后台运行效率
  PROCESS_POWER_THROTTLING_STATE state = {0};
  state.Version = PROCESS_POWER_THROTTLING_CURRENT_VERSION;
  state.ControlMask = PROCESS_POWER_THROTTLING_EXECUTION_SPEED;
  state.StateMask = 0;
  SetProcessInformation(GetCurrentProcess(), ProcessPowerThrottling, &state, sizeof(state));

  // 原有Flutter初始化代码
  FlutterEngineRunArguments engine_args = {};
  engine_args.struct_size = sizeof(FlutterEngineRunArguments);
  engine_args.instance = instance;
  engine_args.entry_point = "main";
  engine_args.command_line = command_line;
  // ... 保留其他原有代码
}

3. 系统任务计划集成(进阶)

若需要应用退出后仍能执行任务,可通过Dart调用Windows任务计划命令:

import 'dart:io';

void createBackgroundTask() async {
  final appPath = '${Directory.current.path}\\your_app.exe';
  // 创建每日8点执行的后台任务
  final result = await Process.run('schtasks', [
    '/create',
    '/tn', 'MyFlutterBackgroundTask',
    '/tr', '$appPath --background',
    '/sc', 'daily',
    '/st', '08:00'
  ]);
  print(result.stdout);
  print(result.stderr);
}

void main(List<String> args) {
  if (args.contains('--background')) {
    // 仅执行后台任务后退出
    runBackgroundTask();
    exit(0);
  }
  runApp(MyApp());
}

void runBackgroundTask() {
  print("Windows任务计划执行后台任务");
  // 执行后台逻辑
}

通用注意事项

  • 后台任务需轻量化,避免占用过多CPU/内存,否则会被系统强制终止。
  • 测试时需模拟应用最小化、失焦、系统休眠等场景,验证任务稳定性。
  • 部分权限配置需在应用打包时同步设置(如macOS后台权限需在Xcode中确认)。

内容的提问来源于stack exchange,提问作者Kyaw Thiha

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 04:20:23