WorkManager与AlarmManager,根据情况选择何种使用方式

47
这个用例:我需要每天 00:30 从网络获取一些数据。这些数据提供了一些特定的时间,其中一个时间大约在 4:30(每天变化1分钟左右,取决于服务器响应,不能在任何地方使用 ++ 或 -- 逻辑)。在这个时间点上(4:30左右),我需要安排一个闹钟。不清楚的是:

我应该直接使用 AlarmManager 吗?

我应该使用 WorkManager 来获取我需要设置闹钟的时间,然后再使用 AlarmManager 吗?

我应该只使用 WorkManager 吗?

我感到困惑的原因是我阅读过的一些博客说,如果我需要在特定时间进行一些工作,则最好坚持使用 AlarmManager,但仍然可以使用 WorkManager。

那么这怎么做呢?

1个回答

28
我应该直接使用AlarmManager吗?
是的,你应该。据我所知,AlarmManager是处理像你这样的任务的最佳选择,而且在处理doze mode时也是更安全的选项。使用第一个闹钟来设置第二个闹钟在特定时间响起。
我应该使用WorkManager获取需要闹钟的时间,然后再使用AlarmManager吗?
如果您想使用此方法,您需要调用AlarmManager并在WorkManager上分派一个Worker。 WorkManager需要在特定时间之前运行,并不能保证Worker会在4.30之前完成或执行。
我感到困惑的原因是因为我阅读过一些博客,说如果我有一些工作要在特定时间完成,最好坚持使用AlarmManager,但仍然可以使用WorkManager。
WorkManager不能保证执行时间。它可能会在未来实现这一点。
我应该只使用WorkManager吗?

不行,因为之前已经表达了原因。

Android-Job是你使用作业调度程序的短期响应,如果你想要使用。此外,如果你访问链接,你可以看到功能和差异的表格。

编辑于17/03/2020:Android-Job已被弃用。

编辑于29/03/2023:对于其他用例,请查看文档中豁免可接受的用例段落。


你是否正确设置了闹钟管理器的参数?你确定你正在正确地重新安排闹钟吗?你使用哪个版本的Android进行测试?闹钟的行为和规则严格与Android版本相关,类似于后台处理。打开一个问题并给出你的代码示例或片段。还要检查文档:https://developer.android.com/training/scheduling/alarms - TomD88
3
我已正确传递了所有参数。我正在7.1版本上进行测试,问题出在待机模式。当应用被杀死时,我的应用程序无法触发闹钟。 - Chirag Prajapati
2
WorkManager 位于几个API之上,其中一个是 AlarmManager,为什么仅在 AlarmManager 之上使用 WorkManager 不足够? - Pavel Poley
1
这取决于你想要实现什么。WorkManager似乎没有实现在精确时间执行任务的功能(我认为这个功能将来会被实现)。如果你去https://developer.android.com/guide/background,建议执行精确时间作业的方法是AlarmManager,而对于所有其他用例,你可以使用WorkManager。这里有更多信息https://developer.android.com/topic/libraries/architecture/workmanager。你可以尝试创建一个简单的应用程序来测试这些差异(行为在Android版本上略有不同)。 - TomD88
@ChiragPrajapati 在这里查看 https://dev59.com/Eofca4cB1Zd3GeqPgDxs 。如果您使用的是 Android 8 或更新版本(例如前台服务),可能需要进行其他修改。希望这可以帮到您。 - TomD88
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接