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

时间:2018-05-30 21:53:51

标签: alarmmanager android-alarms android-broadcastreceiver android-wake-lock android-jobscheduler

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

  • 在准确时间(低至秒)点火警报
  • 系统中可以有多个警报(在不同时间触发)。
  • 如果睡着了,应该唤醒设备并保持唤醒,直到用户完成定义的任务。
  • 应该在尽可能多的Android版本上运行,至少从4.0及更高版本运行(事实上,您可以使用旧手机运行此应用程序是一个优势)。

我用AlarmManager编写了一个小型演示程序。 BroadcastReceiver了解所有这些是如何工作的。我已经研究过AlarmManager,BroadcastReceiver,WakefulBroadcastReceiver和JobScheduler的文档,虽然我理解这些差异,但我不知道哪一个会满足我的要求。

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

有关使用哪些课程的任何建议?我不想去一个给定的方向,后来发现我需要重写一切。

谢谢!

1 个答案:

答案 0 :(得分:2)

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

  • 在准确时间(低至秒)点火警报

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

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

每个选项都可以处理,只要你给它们不同的ID。

  • 如果睡着了,应该唤醒设备并保持唤醒,直到用户完成定义的任务。

听起来您需要让您的警报调用Context.StartForegroundService,并让该前台服务保持运行,直到用户完成任务。再次,这是不鼓励的,因为它浪费电池。

  • 应该在尽可能多的Android版本上运行,至少从4.0及更高版本运行(事实上,您可以使用旧手机运行此应用程序是一个优势)。

AlarmManager和前台服务在所有版本的Android上运行,尽管启动前台服务的调用与Android O略有不同,概念完全相同。

<小时/> 虽然你的应用正在做一些需要立即执行的重要事情,即使屏幕关闭,你也应该抓住唤醒锁。唤醒锁可防止CPU自行暂停,以便您可以处理需要立即执行的操作。如果代码可以等到屏幕打开,那么请不要使用唤醒锁。 JobService始终抓取唤醒锁,因此JobService代码不需要获取单独的唤醒锁。如果您没有运行任何服务,包括JobService,那么即使您有一个唤醒锁,Android也会随机停止您的应用。因此,在进行任何重要工作时,您总是需要某种服务。