【发布时间】:2016-03-17 15:16:15
【问题描述】:
我的 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 秒
什么可能导致这种奇怪的行为?这似乎只发生在三星设备上。
【问题讨论】:
-
您正在查看手机的 SDK。但根据文档,真正的决定因素是您应用的目标 SDK。因此,如果您的目标 SDK 是 23,这将无法在 23 之前的手机上正常工作。
-
设备和目标SDK都是23
标签: android service android-alarms