TUS*_*HAR 9 android timer background-service flutter
我正在尝试创建一个计时器应用程序,它具有针对不同任务的多个倒数计时器。问题,我面临的是,如果我启动一个计时器,然后按后退按钮,计时器就会停止。所以我希望,该计时器一直运行,直到它被暂停或计时器结束并提醒用户或应用程序被销毁。请帮助我如何使用 Flutter 做到这一点?我也使用 sql-lite 来存储所有计时器。
啊,后台任务!Dart(Flutter 使用的语言)是单线程的。
single-threaded意思?像 Dart 这样的单线程语言有一个叫做事件循环的东西。这意味着 Dart 逐行运行代码(除非您使用 Futures,但在这种情况下对您没有帮助)。它注册按钮点击等事件并等待用户按下它们等。
我推荐这篇关于单线程内容的文章和视频:
https://medium.com/dartlang/dart-asynchronous-programming-isolates-and-event-loops-bffc3e296a6a
https://www.youtube.com/watch?v=vl_AaCgudcY&feature=emb_logo
无论如何,解决这个问题的方法(如上面的文章和视频中所述)是隔离。当您在 Dart 中创建一个 Isolate 时,它会启动另一个线程来执行繁重的任务或仅在应用程序可能处于焦点或可能不在焦点上时执行某些操作。这样,主线程可以在另一个线程中加载 UI 之类的内容,它会处理您放入其中的其他内容,从而提高应用程序的性能。
它与你的问题有什么关系?
您可以使用 Isolates 在您的应用程序后台执行任务(无论是否打开)。
本质上,它使用Timer.periodic隔离内部来执行非常适合您的场景的任务。
小智 8
我有类似的问题。隔离不会解决这个问题,因为隔离生命周期也链接到主隔离(ui 线程)。我创建了一个解决方法,即我使用了 dateTime 属性,因此如果用户选择 30 分钟,最终的日期时间将变为 Date time.now(Duration (分钟:30));。还有一个计时器周期性函数,每分钟运行一次,并查找最终日期时间和 datetime.now() 之间的差异,因此,即使操作系统在您重新打开应用程序时在后台应用程序托盘中杀死了您的应用程序,时间也会自动更新为改变。我还使用颤振通知包在计时器值变为零时提醒用户
小智 7
隔离不能解决问题。当应用程序在后台时,即使隔离也会被操作系统暂停。我已经尝试过了(在 Android10 计时器中,它在被系统暂停之前运行了大约 100 秒)。
对于您的问题 Android_Alarm_Manager 包似乎是解决方案。但它只支持安卓。还没有ios支持
小智 5
我参与了一个颤振项目,其场景与您所描述的场景完全相同。
首先让我告诉你,上面提出的隔离物在这里对你不起作用。当您的应用程序不在前台时,隔离似乎会暂停。操作系统杀死后台隔离的原因并不单一 - Android 和 iOS 实现了 ML 驱动的进程管理程序,可以杀死线程以优化电池寿命、使用情况等。
我使用shared_preferences采取了相当基本的方法。(即使应用程序完全从应用程序切换器关闭,即不在后台或前台,我也需要让计时器继续运行)。这是我所做的:
当应用程序位于前台并且计时器启动时,我会监听 Flutter 的生命周期挂钩以了解状态更改。一旦应用程序从前台删除(杀死或移至 b/g),我就会将计时器值保存在shared_preferences中。当应用程序再次位于前台时,我从共享首选项中检查活动计时器,计算保存的计时器之间的差异,并DateTime.now()从调整后的偏移量恢复计时器。