Flutter后台任务执行插件flutter_background的使用
Flutter后台任务执行插件flutter_background的使用
flutter_background
flutter_background
是一个用于保持Flutter应用程序在后台运行的插件。目前,它仅适用于Android平台。
该插件通过结合使用 Android前台服务、部分唤醒锁 和 禁用电池优化,来确保Flutter隔离区(isolate)持续运行。
注意:此插件目前仅支持Android平台。欢迎为iOS提交PR,不过不确定是否能在iOS上实现类似效果。
开始使用
添加依赖
要在项目中使用这个插件,请将 flutter_background
作为依赖添加到您的 pubspec.yaml
文件中:
dependencies:
flutter_background: ^latest_version
Android配置
在 AndroidManifest.xml
中添加以下权限和Service配置:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="de.julianassmann.flutter_background_example">
<!-- 根据需求选择合适的前台服务类型 -->
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<application>
...
<!-- 根据需求选择合适的前台服务类型 -->
<service
android:name="de.julianassmann.flutter_background.IsolateHolderService"
android:exported="false"
android:foregroundServiceType="dataSync|specialUse|..." />
</application>
</manifest>
重要:必须为您的使用场景指定适当的
foregroundServiceType
。更多关于前台服务类型的文档请参考 官方文档 和 可用的服务类型列表。
使用方法
首先导入 flutter_background.dart
:
import 'package:flutter_background/flutter_background.dart';
初始化插件并处理权限
在使用插件之前,您需要通过调用 FlutterBackground.initialize(...)
来初始化它:
final androidConfig = FlutterBackgroundAndroidConfig(
notificationTitle: "flutter_background example app",
notificationText: "Background notification for keeping the example app running in the background",
notificationImportance: AndroidNotificationImportance.normal,
notificationIcon: AndroidResource(name: 'background_icon', defType: 'drawable'), // 默认是mipmap文件夹下的ic_launcher
);
bool success = await FlutterBackground.initialize(androidConfig: androidConfig);
这确保了所有必要的权限被授予,并且如果需要的话会请求这些权限。它还配置了前台通知。上述配置将在调用 FlutterBackground.enableBackgroundExecution()
时创建如下的前台通知:
参数说明:
notificationTitle
: 前台服务通知的标题。notificationText
: 前台服务通知的内容。notificationImportance
: 前台服务通知的重要性。notificationIcon
: 前台服务通知左上角显示的图标。必须是一个可绘制的Android资源(参见这里了解更多)。例如,如果名为 “background_icon” 的图标位于 “drawable” 资源文件夹中,则应设置为AndroidResource(name: 'background_icon', defType: 'drawable')
。enableWifiLock
: 指示当开始后台执行时是否获取Wi-Fi锁。这允许应用程序即使用户长时间未使用设备也能保持Wi-Fi无线电处于唤醒状态(例如,用于后台网络通信)。
在这个例子中,background_icon
是 drawable
文件夹中的一个可绘制资源(参见示例应用)。有关如何创建和存储图标的更多信息,请参阅 Android文档。
为了正确工作,此插件需要一些权限。FlutterBackground.initialize(...)
将根据需要向用户请求权限。您可以在每次调用 enableBackgroundExecution()
之前调用 initialize()
。
为了提前告知用户即将到来的系统权限请求,您可以通过调用以下代码检查应用程序是否已经拥有这些权限:
bool hasPermissions = await FlutterBackground.hasPermissions;
如果应用程序已经有了所有必要的权限,那么就不会向用户显示权限请求。
运行应用程序在后台
通过调用以下代码可以让应用程序在后台运行:
bool success = await FlutterBackground.enableBackgroundExecution();
请注意,在调用 FlutterBackground.enableBackgroundExecution()
之前,必须先调用 FlutterBackground.initialize()
。
停止后台执行:
await FlutterBackground.disableBackgroundExecution();
同样地,在调用 FlutterBackground.disableBackgroundExecution()
之前,也必须先调用 FlutterBackground.initialize()
。
要检查当前是否启用了后台执行,可以使用:
bool enabled = FlutterBackground.isBackgroundExecutionEnabled;
示例
下面是一个完整的示例程序,展示了如何使用 flutter_background
插件进行后台任务处理:
import 'package:flutter/material.dart';
import 'package:flutter_background/flutter_background.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
final androidConfig = FlutterBackgroundAndroidConfig(
notificationTitle: "My App Running in Background",
notificationText: "App is running in background to perform tasks",
notificationImportance: AndroidNotificationImportance.high,
notificationIcon: AndroidResource(name: 'background_icon', defType: 'drawable'),
);
bool initialized = await FlutterBackground.initialize(androidConfig: androidConfig);
if (initialized) {
runApp(MyApp());
}
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Background Example',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
bool _isBackgroundExecutionEnabled = false;
@override
void initState() {
super.initState();
_checkBackgroundExecutionStatus();
}
Future<void> _checkBackgroundExecutionStatus() async {
bool isEnabled = await FlutterBackground.isBackgroundExecutionEnabled;
setState(() {
_isBackgroundExecutionEnabled = isEnabled;
});
}
Future<void> _toggleBackgroundExecution() async {
if (_isBackgroundExecutionEnabled) {
await FlutterBackground.disableBackgroundExecution();
} else {
await FlutterBackground.enableBackgroundExecution();
}
_checkBackgroundExecutionStatus();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Flutter Background Example'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'Background Execution Status:',
),
Text(
_isBackgroundExecutionEnabled ? 'Enabled' : 'Disabled',
style: Theme.of(context).textTheme.headline4,
),
SizedBox(height: 20),
ElevatedButton(
onPressed: _toggleBackgroundExecution,
child: Text(_isBackgroundExecutionEnabled ? 'Disable Background Execution' : 'Enable Background Execution'),
),
],
),
),
);
}
}
这个示例程序提供了一个简单的UI界面,允许用户启用或禁用应用程序的后台执行功能。同时,它还会显示当前的后台执行状态。
如果您有任何问题或者建议,请随时在 GitHub Issues 上创建一个新的issue。我们非常欢迎您贡献代码!
维护者
希望这篇文档对您有帮助!如果您有任何疑问,请随时提问。
更多关于Flutter后台任务执行插件flutter_background的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter后台任务执行插件flutter_background的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是一个关于如何在Flutter项目中使用flutter_background
插件来执行后台任务的示例代码。flutter_background
插件允许你的应用在后台运行时执行某些任务,比如定时任务、网络请求等。
1. 添加依赖
首先,你需要在pubspec.yaml
文件中添加flutter_background
插件的依赖:
dependencies:
flutter:
sdk: flutter
flutter_background: ^0.7.3 # 请检查最新版本号
然后运行flutter pub get
来安装依赖。
2. 配置Android权限
在android/app/src/main/AndroidManifest.xml
中添加必要的权限,比如网络权限:
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
3. 配置Android服务
在android/app/src/main/kotlin/[your_package_name]/BackgroundService.kt
中创建一个服务类(如果还没有的话):
package com.example.yourapp
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.embedding.android.FlutterActivity
import io.flutter.plugins.background.BackgroundExecutor
import io.flutter.plugins.background.FlutterBackgroundService
class BackgroundService: FlutterBackgroundService() {
override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
super.configureFlutterEngine(flutterEngine)
// 这里可以注册你的Dart代码中的Isolate
BackgroundExecutor.instance.registerBackgroundIsolate("your_isolate_name", DartExecutor.DartEntrypoint.createDefault())
}
}
4. 编写Dart代码
在你的lib
目录下创建一个新的Dart文件,比如background_task.dart
,用于定义后台任务:
import 'package:flutter_background/flutter_background.dart';
import 'dart:isolate';
void backgroundTask() async {
// 在这里执行你的后台任务,比如网络请求、数据库操作等
print("后台任务正在执行...");
// 模拟长时间任务
await Future.delayed(Duration(seconds: 10));
print("后台任务完成");
}
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await FlutterBackground.initialize(
androidConfiguration: AndroidConfiguration(
autoStart: true,
isForegroundService: true,
),
iosConfiguration: IOSConfiguration(
autoStart: true,
),
);
// 注册后台任务
FlutterBackground.registerTask<void>("your_task_name", backgroundTask);
// 启动后台任务
FlutterBackground.runTask("your_task_name");
// 保持应用运行(仅在调试时使用,生产环境中不应这样做)
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Flutter Background Task Demo'),
),
body: Center(
child: Text('Check the console for background task logs.'),
),
),
);
}
}
5. 启动服务
在你的MainActivity.kt
(或MainApplication.java
,取决于你的项目结构)中启动后台服务:
package com.example.yourapp
import android.os.Bundle
import io.flutter.embedding.android.FlutterActivity
class MainActivity: FlutterActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// 启动后台服务
FlutterBackgroundService.start(this, BackgroundService::class.java)
}
}
6. 运行应用
现在你可以运行你的Flutter应用,当应用进入后台时,backgroundTask
函数会被调用执行后台任务。
注意事项
- 确保你理解后台任务对电池寿命的影响,并尽可能减少后台任务的执行频率和时长。
- 在实际开发中,你可能需要根据具体需求调整后台任务的逻辑和配置。
- 插件的API和配置可能会随着版本的更新而变化,请参考最新的官方文档。