setAlarmClock在通知栏中没有图标

时间:2015-10-18 05:28:30

标签: android alarmmanager alarm android-6.0-marshmallow

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

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

不幸的是,这完全是Android开发人员故意设计的,以节省电池。当您浏览AlarmManager方法的文档时,这一动机变得很清楚。例如,此引用来自AlarmManager#setExactAndAllowWhileIdle上的文档:

  

这些警报在闲置时会严重影响设备的电源使用(并因此严重影响了安排它们的应用程序的电池消耗),因此应谨慎使用。 为减少滥用,对于特定应用程序,这些警报发出的频率受到限制。在正常的系统操作下,它将不超过大约每分钟分发这些警报(此时将分发每个此类挂起的警报)。在低功率空闲模式下,此持续时间可能会明显更长,例如15分钟 [强调我的]

因此,如果您确实确实需要确切的警报,则Google希望您通过在状态栏中放置小闹钟来向用户发出某种信号,告知您的应用可能正在消耗电力。引用AlarmManager#setAlarmClock上的文档:

  

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

因此,您剩下两个选择:

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

答案 2 :(得分:0)

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

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