Bas*_*asj 4 android alarm ios dart flutter
我希望应用程序每天下午 2 点打开一个对话框,即使用户正在做其他事情并且此时当前不在应用程序界面中。
如何使用 Flutter 做到这一点,使其同时在 Android 和 iOS 上运行?
我正在考虑这样的方法:
timer = Timer.periodic(Duration(seconds: 60), (Timer t) => checkTime());
Run Code Online (Sandbox Code Playgroud)
每分钟检查一次是否在 14:00:00 和 14:00:59 之间,其方法类似于 flutter run function every x amount of Second,但这似乎浪费资源:可能有更好的,有更多在精确的时间唤醒后台应用程序的自然方式?
问题:如何使用 Flutter 让应用程序在每天下午 2 点显示一个对话框,即使用户正在做其他事情/在另一个应用程序中?
注意:如果设备屏幕关闭(即用户没有使用手机),则下次屏幕打开时应显示该对话框。
我的解决方案是使用(当前版本 0.4.1) flutter 包来实现您正在寻找的要求。由于它是由Flutter 社区团队维护的,因此我们可以期待长期支持。workmanager
根据他们的文档
Flutter WorkManager 是Android 的 WorkManager和iOS 的 PerformFetchWithCompletionHandler 的包装器,可有效地在后台实现 Dart 代码的无头执行。
这对于运行周期性任务特别有用,例如定期获取远程数据。
Android 工作管理器将根据其运行版本的操作系统级别自动处理后台进程。
来到 iOS 后,根据他们的文档,该包用于执行后台操作的功能已被弃用。但Flutter 社区团队已准备好根据GitHub 存储库中的评论在即将发布的版本中推送替代版本。因此,升级到最新版本将帮助您解决此问题。
初始化wrokmanager里面的main()
Workmanager().initialize(
callbackDispatcher, // The top level function, aka callbackDispatcher
isInDebugMode:
true // If enabled it will post a notification whenever the task is running. Handy for debugging tasks
);
Run Code Online (Sandbox Code Playgroud)
然后如下安排任务
Workmanager().registerOneOffTask("1", "simpleTask_1",
initialDelay: Duration(seconds: 15));
Workmanager().registerPeriodicTask("102", "simplePeriodicTask_1",
initialDelay: Duration(seconds: 15),
frequency: Duration(minutes: 15)); // Set your 2 PM frequency here.
Run Code Online (Sandbox Code Playgroud)
有关计划任务的可用选项,请参阅文档和设置。
并定义 a callbackDispatcher,它需要是静态函数或顶级函数,才能根据文档作为 Flutter 入口点进行访问。
//Defined outside main()
void callbackDispatcher() {
Workmanager().executeTask((task, inputData) {
print(
"Native called background task: callbackDispatcher"); //simpleTask will be emitted here.
createNotify(); // Created a local notification to make sure everything works in background - In your case show alert here.
return Future.value(true);
});
}
// your main() goes here
Run Code Online (Sandbox Code Playgroud)
不要显示通知,而是派生逻辑以显示警报弹出窗口。
编辑1:
回答您在评论中提出的问题
如何检查该程序每天仅在下午 14:00:00 左右运行一次?
计划的工作存储在内部管理的 SQLite 数据库中,WorkManager 负责确保该工作持续存在并在设备重新启动时重新安排。并且这会执行多次,直到手动取消为止。
除此之外,出于开发目的,您还可以设置最小间隔并验证一次,例如 1 小时一次。工作管理器支持的最小间隔为 15 分钟。即使您设置的时间低于该阈值,默认值也会设置为 15 分钟。
您的代码似乎会定期运行,但不会在特定时间运行。
到目前为止,还不支持开箱即用。但是我们可以在调度任务时利用初始延迟。计算当前时间和您要触发的时间之间的时间差。 例如,如果我想在 9 点安排一些任务,当安排任务时,您可以执行以下操作“当应用程序在 7 点打开时”,然后将初始延迟设置为两个小时。请参阅与此相关的stackoverflow 答案。
另外,使用这种方法,您确定它不会被操作系统自动关闭以节省电池吗?
根据 WorkManager文档,执行将在我们指定的时间间隔内发生。由于WorkManager 受到操作系统电池优化(例如打瞌睡模式)的影响,我们需要注意执行可能会延迟但不会取消。
最后一件事:后台进程可以在没有用户交互的情况下启动弹出窗口吗?(其他答案提到这实际上不可能)。再次感谢!
对我来说,这是棘手的部分。从技术上讲,如果没有后台的用户操作,我们就无法显示 UI。因为,UI需要context基于它来向用户显示。因此,说dart实话,可能很难显示您正在寻找的一些警报弹出窗口。但如果您只想显示某种信息,您可以尝试一下,FlutterToast因为它将从后台显示给用户。
编辑2
当应用程序未打开时,您寻求显示警报的要求称为“在其他应用程序上绘制”,据我猜测,它仅在Android中有效,因为 iOS 中没有此类功能。
您可以在 flutter 中引用此包,以便根据您的要求显示警报。与此包实现结合起来WorkManager即可达到您想要的结果。我还没有尝试过这个包,但如果您遇到任何问题,请告诉我。
快乐编码!
| 归档时间: |
|
| 查看次数: |
3512 次 |
| 最近记录: |