如何使用 Flutter 在 Android 上让后台任务在后台保持活动状态?
How can I keep background tasks alive in background on Android using Flutter?
我有一个可以计算时间、设置宏并显示通知和提醒的商务应用程序。
当应用程序进入后台并且 Android 停止我的计数任务时我遇到了问题。
我尝试了很多方法来让这些任务保持活力,但我失败了。此通知需要脱机工作,因此 FCM 不是一个好的解决方案。
我该如何解决?
Obs.: 当应用程序进入前台时,所有任务都会工作并显示所有通知...但是我需要及时提醒用户,而不仅仅是在前台。
我创建了一个解决方案!
搜索该站点https://dontkillmyapp.com/我看到很多应用程序都有相同的问题以及针对不同品牌和型号的一些解决方案。
检查了其中一些后,我看到许多已安装的应用程序默认都有此配置,所以我搜索如何通过编程实现。
这里是解决方案:
pubspec.yaml
android_power_manager: ^0.1.6
permission_handler: ^5.0.1+1
函数:
void init() async {
var status = await Permission.ignoreBatteryOptimizations.status;
print("status: $status");
if (status.isGranted) {
print(
"isIgnoring: ${(await AndroidPowerManager.isIgnoringBatteryOptimizations)}");
if (!(await AndroidPowerManager.isIgnoringBatteryOptimizations)) {
AndroidPowerManager.requestIgnoreBatteryOptimizations();
}
} else {
Map<Permission, PermissionStatus> statuses = await [
Permission.ignoreBatteryOptimizations,
].request();
print(
"permission value: ${statuses[Permission.ignoreBatteryOptimizations]}");
if (statuses[Permission.ignoreBatteryOptimizations].isGranted) {
AndroidPowerManager.requestIgnoreBatteryOptimizations();
} else {
exit(0);
}
}
}
AppWidget.dart(主要)
@override
Widget build(BuildContext context) {
init();
SystemChrome.setPreferredOrientations([
DeviceOrientation.portraitUp,
DeviceOrientation.portraitDown,
]);
DataTransferService().initTimerTask();
return MaterialApp(
navigatorKey: Modular.navigatorKey,
title: APP_NAME,
theme: ThemeData(
primarySwatch: Colors.green,
),
initialRoute: '/',
routes: {
'/': (context) => LoginPage(),
'/home': (context) => HomePage(),
'/notification': (context) => NotificationPage(),
'/alerts': (context) => AlertsPage(),
},
onGenerateRoute: Modular.generateRoute,
);
}
因此,应用请求许可(如果需要),如果获得许可,则请求用户将应用设置为忽略电池优化。
现在通知一切正常! =]
您可能想要 Android service 到 运行 这些任务(前景或背景取决于您的具体要求)。
看起来已经构建了一些 Flutter packages 来帮助解决这个问题,但我会密切关注它们在支持不同 Android 版本方面提供的内容.
我有一个可以计算时间、设置宏并显示通知和提醒的商务应用程序。 当应用程序进入后台并且 Android 停止我的计数任务时我遇到了问题。
我尝试了很多方法来让这些任务保持活力,但我失败了。此通知需要脱机工作,因此 FCM 不是一个好的解决方案。
我该如何解决?
Obs.: 当应用程序进入前台时,所有任务都会工作并显示所有通知...但是我需要及时提醒用户,而不仅仅是在前台。
我创建了一个解决方案!
搜索该站点https://dontkillmyapp.com/我看到很多应用程序都有相同的问题以及针对不同品牌和型号的一些解决方案。
检查了其中一些后,我看到许多已安装的应用程序默认都有此配置,所以我搜索如何通过编程实现。
这里是解决方案:
pubspec.yaml
android_power_manager: ^0.1.6
permission_handler: ^5.0.1+1
函数:
void init() async {
var status = await Permission.ignoreBatteryOptimizations.status;
print("status: $status");
if (status.isGranted) {
print(
"isIgnoring: ${(await AndroidPowerManager.isIgnoringBatteryOptimizations)}");
if (!(await AndroidPowerManager.isIgnoringBatteryOptimizations)) {
AndroidPowerManager.requestIgnoreBatteryOptimizations();
}
} else {
Map<Permission, PermissionStatus> statuses = await [
Permission.ignoreBatteryOptimizations,
].request();
print(
"permission value: ${statuses[Permission.ignoreBatteryOptimizations]}");
if (statuses[Permission.ignoreBatteryOptimizations].isGranted) {
AndroidPowerManager.requestIgnoreBatteryOptimizations();
} else {
exit(0);
}
}
}
AppWidget.dart(主要)
@override
Widget build(BuildContext context) {
init();
SystemChrome.setPreferredOrientations([
DeviceOrientation.portraitUp,
DeviceOrientation.portraitDown,
]);
DataTransferService().initTimerTask();
return MaterialApp(
navigatorKey: Modular.navigatorKey,
title: APP_NAME,
theme: ThemeData(
primarySwatch: Colors.green,
),
initialRoute: '/',
routes: {
'/': (context) => LoginPage(),
'/home': (context) => HomePage(),
'/notification': (context) => NotificationPage(),
'/alerts': (context) => AlertsPage(),
},
onGenerateRoute: Modular.generateRoute,
);
}
因此,应用请求许可(如果需要),如果获得许可,则请求用户将应用设置为忽略电池优化。
现在通知一切正常! =]
您可能想要 Android service 到 运行 这些任务(前景或背景取决于您的具体要求)。
看起来已经构建了一些 Flutter packages 来帮助解决这个问题,但我会密切关注它们在支持不同 Android 版本方面提供的内容.