三星

时间:2016-03-17 15:16:16

标签: android service android-alarms

我的Android应用程序在Marshmallow上使用setExactAndAllowWhileIdle运行重复警报。警报每隔10秒发生一次,并通过使用权限REQUEST_IGNORE_BATTERY_OPTIMIZATIONS避免打瞌睡模式(设备已同意忽略此应用程序的电池优化)

 public void startAlarm(Intent alarmIntent, int delayMs, int alarmId) {
    PendingIntent recurringAlarm = PendingIntent.getBroadcast(context.getApplicationContext(), alarmId,
            alarmIntent, PendingIntent.FLAG_CANCEL_CURRENT);
    AlarmManager alarms = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    Calendar updateTime = Calendar.getInstance();
    alarms.cancel(recurringAlarm);
    if (Build.VERSION.SDK_INT >= 23) {
        alarms.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, updateTime.getTimeInMillis() + delayMs, recurringAlarm);
    } else if (Build.VERSION.SDK_INT >= 19) {
        alarms.setExact(AlarmManager.RTC_WAKEUP, updateTime.getTimeInMillis() + delayMs, recurringAlarm);
    } else {
        alarms.set(AlarmManager.RTC_WAKEUP, updateTime.getTimeInMillis() + delayMs, recurringAlarm);
    }
}

此警报启动服务。然后,该服务使用相同的方法(上面)创建10秒的另一个警报。我认为此警报将每10秒发生一次,因为忽略了打盹模式,但在极少数情况下,警报将被推迟更长时间:

  • 53分6秒
  • 18分40秒
  • 54分钟37分19秒
  • 1天48分30秒

可能导致这种奇怪行为的原因是什么?这似乎只发生在三星设备上。

2 个答案:

答案 0 :(得分:3)

官方文件陈述

  

为减少滥用行为,对特定应用程序的警报响应频率有限制。在正常的系统操作下,它不会大约每分钟发送这些警报(此时会发送每个这样的待处理警报);当处于低功率空闲模式时,此持续时间可能会明显更长,例如15分钟。

我怀疑三星已做出修改,使这段时间超过15分钟。他们以进行深度修改而闻名,这些修改通常会导致意外行为。

答案 1 :(得分:2)

您无法在较新版本的Android上设置此警报,您应该在日志中看到这一点:

Suspiciously short interval 10000 millis; expanding to 60 seconds

如果您需要的警报时间少于60秒,则需要一种与AlarmManager不同的机制,如Handler或HandlerThread。