【问题标题】:Why my repeating alarm is triggered much rarer than expected?为什么我的重复警报触发次数比预期的要少得多?
【发布时间】:2021-03-24 18:48:19
【问题描述】:

我正在编写我的第一个警报程序。该程序设置一个重复警报,预计每 200 毫秒触发一次。但重点是,间隔几乎是 40 秒!!似乎我设置的任何间隔时间都无关紧要。所以实际上,在 API 19 之后似乎没有办法让setRepeating() 类的警报更频繁地触发,而不是大约 40 秒,对吧? 这是代码的sn-p:

if(alarmRepetition.equalsIgnoreCase(context.getString(R.string.alarm_once))){
      Intent backIntent = new Intent("Time to delete an Alarm kva-kva");
      backIntent.putExtra("Time to delete", alarmId);
      Calendar calendarNow = Calendar.getInstance();
      PendingIntent pendingIntent = PendingIntent.getBroadcast(context, alarmId, backIntent, 0);
      AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
      alarmManager.setRepeating(AlarmManager.RTC, calendarNow.getTimeInMillis(), 200, pendingIntent);
}

【问题讨论】:

  • 每 200 毫秒重复一次警报似乎是对系统资源的滥用。这是要测试的玩具示例,还是您实际上每 200 毫秒尝试做一些事情?如果是这样,AlarmManager 几乎肯定是错误的工具。您可能需要一个前台服务,它每 200 毫秒在进程中运行一次。
  • 嗨瑞恩!当然这是一个玩具例子!在任何实际情况下,我绝对不需要每 200 毫秒发出一次警报。
  • 你好安德烈。我知道有几种选择。但我不明白为什么我们真的需要 setRepeating() 函数中的第三个参数,如果它真的没有任何意义的话。无论我将其设置为 5 秒还是几分之一秒 - 警报仍会在至少 40 秒左右重复。

标签: android alarmmanager android-alarms repeatingalarm


【解决方案1】:

根据docs

从 API 19 开始,所有重复警报都是不准确的。如果您的应用程序 需要精确的交货时间,那么它必须使用一次性精确警报, 每次如上所述重新安排时间

AlarmManager 将尝试将警报安排在一起以节省电池寿命

【讨论】:

  • 是不是说setRepeating()函数中的第三个参数只起任何作用,实际上是>40000ms? (因为平均而言,警报似乎至少每 40 秒重新触发一次)。很奇怪...如果有这样的限制,为什么 API 仍然允许更小的值?.. 所以自 API 19 以来,没有办法让重复警报更频繁地重复?
  • 在您的示例中,由于警报之间的时间间隔极短,因此它不太可能按时触发,但如果您每小时说一次,您有时会看到它按时触发。 IIRC 从触发时间开始有 15 分钟的窗口可以触发。 “为什么第三个参数允许这么小的值?”,为了向后兼容。为了能够创建一个在您想要的时候准确触发的警报,您必须按照文档所说的操作并使用 setExact,当它触发时,您然后使用 setExact 创建另一个警报,您现在就有了重复警报。
  • 知道了!谢谢!
猜你喜欢
  • 2016-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多