【问题标题】:AlarmManager or JobScheduler compatible with all Android versions?AlarmManager 或 JobScheduler 是否兼容所有 Android 版本?
【发布时间】:2018-05-30 21:53:50
【问题描述】:

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

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

我使用 AlarmManager 和 BroadcastReceiver 编写了一个小演示,以了解所有这些是如何工作的。我研究了 AlarmManager、BroadcastReceiver、WakefulBroadcastReceiver 和 JobScheduler 的文档,尽管我了解其中的差异,但我不知道哪一个可以满足我的要求。

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

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

谢谢!

【问题讨论】:

  • "如果设备处于睡眠状态,应唤醒设备并保持唤醒状态,直到用户完成定义的任务。"永远不会发生。 Android 竭尽全力确保在用户不触摸设备时,任何应用都无法让设备保持唤醒状态。

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


【解决方案1】:

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

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

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

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

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

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

听起来您需要让警报调用 Context.StartForegroundService,并让该前台服务一直运行,直到用户完成任务。同样,不鼓励这样做,因为它会浪费电池。

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

AlarmManager 和前台服务可在所有版本的 Android 上运行,虽然在 Android O 中启动前台服务的调用略有不同,但概念是相同的。


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

【讨论】:

  • 嗨,MD,再次感谢。您能否详细说明带有文件的多个调度程序,我无法遵循那个,
  • 另外,wakelock 似乎就足够了 - 不要认为我需要前台服务
  • 但 JibScheduler 似乎取代了唤醒锁?
  • @kxtronic:我无法详细说明带有文件的多个调度程序,因为这些是 100% 不相关的概念,而且我完全不知道你想问我什么。唤醒锁至少是一个相关的概念,我可以讨论这些。不过,您可能需要前台服务,我补充了原因。
  • 嗨,MD,让我们逐步进行。我的第一个问题是,即使在 4.0.3 上,警报也不准确,根据文档,在这个操作系统级别上应该是准确的。有什么想法可以在尽可能多的 Android 版本中获得准确的警报吗? (请参见上面添加的代码)
猜你喜欢
  • 1970-01-01
  • 2012-12-06
  • 2021-12-27
  • 1970-01-01
  • 2021-07-22
  • 1970-01-01
  • 2016-01-02
  • 1970-01-01
  • 2021-06-03
相关资源
最近更新 更多