当前位置: 首页 > 知识库问答 >
问题:

在后台服务中每n分钟运行一次任务

施梓
2023-03-14

大家好,耶稣受难节,

我知道这似乎是一个重复的问题,但事实并非如此,我将向您解释原因:

有几种方法可以在计划的时间执行任务,如TimerTask或ScheduleExecutorService,但它们都不适合我要做的事情,因为这些方法都是这样工作的:

  1. --

但我不希望我的代码在计划时间后一次又一次地运行,我希望我的代码总是在每个计划时间执行,即使是第一次。

还有一个问题:如果android停止后台服务会发生什么?我添加了一个重启器接收器,以便重新启动服务,

后台服务重新启动时会发生什么情况?由于TimerTask或ScheduleExecutorService被终止并再次启动,上述步骤将从1重复到2。

结果如何?

让我们假设我想每3分钟运行一次任务,但android仅在30秒后就杀死了我的服务:由于第一次执行ulul run()中的代码,结果是我的代码在30秒后执行,而不是3分钟!

所以我的问题是:是否有可能每X分钟在Android后台服务中运行一次任务或方法来避免上述问题?

谢谢

共有1个答案

孟嘉歆
2023-03-14

是的,我相信您为工作带来了错误的工具。您可能可以使用JobScheduler警报管理器来实现您想要的结果。但是您应该使用的是WorkManager

WorkManager是高度可配置的,它允许您创建周期工作请求OneTimeWorkRequest,这些都保证会成功。周期工作请求将在您安排工作时以及您在计时器中指定时触发。即使应用程序关闭或背景接地,它也会在后台执行。如果您不想立即执行任务,您可以使用带有FlexInterval的PWR。有关更多信息,请参阅下面的文档。

WorkManager文档

WorkManager架构

CodeLab

例如,我创建了两个PeriodicWorkRequests来刷新服务,并通过续订其令牌来保持用户始终登录。当用户进行身份验证时,将创建PeriodicWorkRequest。通常它会立即启动您的工作,这听起来像您想要的用例。然而,在我的情况下,我不需要立即启动它,因为他们刚刚收到并缓存了这些信息,所以我使用了FlexInterval。当应用程序处于后台或关闭状态时,工作人员将继续每12小时刷新一次服务,并每6小时刷新一次令牌。它就像一个符咒。

 类似资料:
  • 我试图在后台设置每5分钟运行一次服务。但它表现得很奇怪: 在Main activity的onCreate中,我将它安排为每5分钟运行一次: 我严格遵循了本教程: https://guides.codepath.com/android/starting-background-services#using-with-alarmManager-for-periodial-tasks

  • 我有一个更新LetsEncrypt证书的Ansible任务。我只希望这项任务每周运行一次,以避免因重击API而受阻,但其余的任务需要每天运行- 有没有可能对一个可完成的任务进行速率限制,如果它在过去n小时内已经运行过,那么它将被跳过? 我能想到的最好的方法是,如果任务已运行,则触摸文件,如果文件存在并且比某个时间戳更新,则跳过任务 — 我确实想过在<code>ansible中对任务应用标记,并将标

  • 编写一个CRON表达式,从特定时间开始每隔X分钟运行一次。具体时间由用户传入。我现在的表情是这样的“0 10/15?* * *" (每15分钟) 这将相应地每15分钟运行一次,但当下一个开始时间的下一个小时时钟设置为原始分钟时(11:20),而不是时钟设置为11:05。我需要它从最初的开始时间开始无限期地每15分钟运行一次 这是我第一次使用CRON,并且很难找到如何正确编写表达式的信息。

  • 即使应用程序在后台,我也需要每5分钟在Android应用程序中运行一次代码。我对android Studio知之甚少,比如将代码放在哪里,以及如何正确执行以避免在后台时崩溃和不同的错误。 该应用程序是一个网络视图,从站点代码中提取JS的Id,然后我需要每隔5分钟运行一个带有该Id的脚本。

  • 问题内容: 我正在使用Python和PyGTK。我对运行某个功能感兴趣,该功能每隔几分钟从串行端口获取数据并保存一次。 当前,我正在时间库中使用sleep()函数。为了能够进行处理,我将系统设置如下: 这种设置使我从串口读取数据的间隔为5分钟。我的问题是我希望能够让我的readserial()函数每隔5分钟暂停一次,并且能够一直执行操作,而不是使用time.sleep()函数。 关于如何解决这个问

  • 我试图开发一个flutter应用程序,它将从服务器每10秒使用计时器获取数据。它在前景时都工作得很好。所以我按照这里提供的文档工作管理器,我可以从服务器得到数据,即使当应用程序在后台,但不能减少频率低于15分钟。我不想在原生android和iOS中编码。我该如何处理这种情况?有没有我遗漏的解决方案?