如何在颤动的后台运行时钟计时器?

Posted

技术标签:

【中文标题】如何在颤动的后台运行时钟计时器?【英文标题】:How to run clock timer in background on flutter? 【发布时间】:2020-04-16 04:57:20 【问题描述】:

我正在尝试创建一个计时器应用程序,该应用程序具有多个用于不同任务的倒数计时器。问题,我面临的是,如果我启动一个计时器,然后按返回按钮,计时器就会停止。所以我想要,该计时器一直运行到它被暂停或计时器结束并提醒用户或应用程序被破坏。帮助我如何使用 Flutter 做到这一点?我也使用 sql-lite 来存储所有计时器。

【问题讨论】:

【参考方案1】:

啊,后台任务! 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 来执行适合您的场景完美的任务。

【讨论】:

codingwithjoe 网站似乎不存在了:/ 请勿点击本杰明提供的链接!如上所述,该网站不存在。相反,您将被链接到一个网站,该网站会要求您通过单击允许权限提示来验证自己。如果您这样做,它将尝试将病毒下载到您的计算机上。您还将开始从浏览器接收推送通知,告知您感染了 5 种病毒。同样,不要按该链接。 OP,请删除它。 我点击了链接(因为我在 linux 上),它们很好..我建议你删除或编辑 cmets.. 一定有人修复了之前的链接。【参考方案2】:

隔离不能解决问题。当应用程序在后台时,即使隔离也会被操作系统暂停。我试过了(在android10中定时器运行了大约100秒,然后被系统暂停)。

对于您的问题,Android_Alarm_Manager 包似乎是解决方案。 但它只支持安卓。尚不支持ios

【讨论】:

那么我们能为 IO 做些什么吗?【参考方案3】:

我遇到了类似的问题。 隔离不会解决它,因为隔离生命周期也链接到主隔离(ui 线程)。 我创建了一个解决方法,即我使用了 dateTime 属性,因此如果用户选择 30 分钟,则最终日期时间变为 Date time.now(Duration (minutes:30));。 还有一个定时器周期函数,它每分钟运行一次,并找到最终日期时间和 datetime.now() 之间的差异,所以即使当你重新打开应用程序时操作系统在后台应用程序托盘中杀死你的应用程序,时间也会自动更新为改变。 我还使用颤振通知包在计时器值变为零时提醒用户

【讨论】:

应该是 Date time.now().add(Duration (minutes:));

以上是关于如何在颤动的后台运行时钟计时器?的主要内容,如果未能解决你的问题,请参考以下文章

当手机进入空闲状态时后台服务停止

如何在后台运行计时器

如何在Python中运行后台计时器

如何在应用程序进入后台或终止时运行计时器

即使应用程序在后台运行或手机被锁定在 Windows Phone 中,如何让计时器运行

使用应用程序时颤动后台任务