【问题标题】:setAlarmClock without icon in notification bar通知栏中没有图标的 setAlarmClock
【发布时间】:2015-10-18 05:28:29
【问题描述】:

为了在 Android OS 6(又名 Marshmallow)中构建准确可靠的警报,我不得不使用 AlarmManager 的 setAlarmClock 方法。问题是此方法在顶部状态栏中显示警报图标。由于我的应用需要闹钟在每天午夜刷新一些数据,所以它会永远显示闹钟图标,这很不愉快。

【问题讨论】:

标签: android alarmmanager alarm android-6.0-marshmallow


【解决方案1】:

不幸的是,这完全是 Android 开发人员为了节省电池而故意设计的。当您查看 AlarmManager 方法的文档时,这个动机就变得很清楚了。例如,这句话取自AlarmManager#setExactAndAllowWhileIdle上的文档:

这些警报在空闲时会显着影响设备的电源使用(从而导致调度它们的应用程序对电池造成重大影响),因此应谨慎使用。 为了减少滥用,对于特定应用程序,这些警报的触发频率存在限制。在正常的系统操作下,它不会超过大约每分钟发送这些警报(此时每个此类挂起的警报都会被发送);在低功耗空闲模式下,此持续时间可能会更长,例如 15 分钟[强调我的]

因此,如果您确实需要确切的闹钟,Google 希望您通过将小闹钟放在状态栏中以某种方式向用户发出信号,表明您的应用可能正在耗尽电量。引用AlarmManager#setAlarmClock上的文档:

因此,这些类型的警报在电池使用方面可能非常昂贵,并且只能用于其预期目的。

因此,您有以下两个选择:

  1. 使用 AlarmManager#setExactAndAllowWhileIdle 并接受最长 15 分钟的延迟
  2. 使用AlarmManager#setAlarmClock并接受闹钟

【讨论】:

  • 通知阴影栏中除了闹钟图标外,有什么办法可以隐藏时间吗?
【解决方案2】:

您需要使用setExactAndAllowWhileIdle()。如果您的应用没有忽略优化,那么您有 10 秒的时间来实现您的目标。如果您需要更多时间、部分唤醒锁和/或互联网访问,您需要添加权限以请求用户忽略优化。

【讨论】:

【解决方案3】:

如果我理解正确,您想使用AlarmManager 在午夜安排任务而不显示 UI 时钟。您可以使用AlarmManager#set 这不会显示时钟。例如

  alarm.set(
      AlarmManager.RTC_WAKEUP,
      midnightInMillis,
      PendingIntent.getService(getApplicationContext(), 11, intent, PendingIntent.FLAG_UPDATE_CURRENT)
  );

【讨论】:

  • 从您发布的链接中:Note: Beginning in API 19, the trigger time passed to this method is treated as inexact: the alarm will not be delivered before this time, but may be deferred and delivered some time later.,根据 OP 对另一个答案的评论,这不是 OP 想要的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-20
  • 2014-07-15
  • 1970-01-01
  • 2012-04-14
  • 2018-03-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多