如何在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
相关产品推荐
相关产品推荐

