AlarmManager 或 JobScheduler 与所有 Android 版本兼容?

AlarmManager or JobScheduler compatible with all Android versions?

我需要一些帮助来决定在我的应用中采用哪个 类 必须满足这些要求:

我用 AlarmManager 和 BroadcastReceiver 编写了一个小演示,以了解所有这些是如何工作的。我研究了 AlarmManager、BroadcastReceiver、WakefulBroadcastReceiver 和 JobScheduler 的文档,尽管我理解它们之间的差异,但我不知道哪个(哪些)能满足我的要求。

从文档中,我得到的印象是我可能需要编写多个版本的应用程序以适应它将 运行 使用的不同 Android 版本。这将是一场噩梦!

有什么关于 类 使用的建议吗?我不想只朝着一个给定的方向前进,后来发现我需要重写所有内容。

谢谢!

您不需要应用的多个版本,您只需要多个 "scheduler" 实现,每个实现只有几个文件,并且都调用相同的应用逻辑。

  • 在准确的时间触发警报(精确到秒)

好吧,只有一个选项可以解决这个问题。你需要一个 AlarmManager.setExact。强烈建议不要这样做,因为它会浪费电池。

  • 系统中可以有多个警报(在不同时间触发)。

那里的每个选项都会处理这个问题,只要您给它们不同的 ID。

  • 应在设备处于睡眠状态时将其唤醒并保持唤醒状态,直到用户完成定义的任务。

听起来您需要拨打闹钟 Context.StartForegroundService,并离开该前台服务 运行ning 直到用户完成任务。同样,不鼓励这样做,因为它会浪费电池。

  • 应该 运行 在尽可能多的 Android 版本上,至少从 4.0 开始(事实上你可以使用旧的 phone 到 运行 这个应用程序是一个加号)。

A​​larmManager 和前台服务 运行 在 Android 的所有版本上,尽管启动前台服务的调用与 Android O 略有不同,但概念是相同的。


当你的应用正在做一些需要立即执行的重要事情时,即使屏幕关闭,你也应该抓住唤醒锁。唤醒锁可防止 CPU 暂停自身,以便您可以处理需要立即发生的事情。如果代码可以等到屏幕打开,那么请不要使用唤醒锁。 JobService 总是获取唤醒锁,因此 JobService 代码不需要获取单独的唤醒锁。如果您没有 运行ning 服务,包括 JobService,那么 Android 将随机停止您的应用程序,即使您有唤醒锁。所以你在做任何重要的工作时总是需要某种服务。