我已经成功地使用以下构造在我的一些应用程序中启动了一个 AlarmManager,直到 Android 5:
Intent serviceIntent = new Intent(context, MyService.class);
PendingIntent pi = PendingIntent.getService(context, alarmId, serviceIntent,
PendingIntent.FLAG_UPDATE_CURRENT);
DateTime inMinutes = (new DateTime()).plusMinutes(60);
AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
am.set(AlarmManager.RTC_WAKEUP, inMinutes.getMillis(), pi);
但是从 Marshmallow 开始,AlarmManager 要么未设置,要么在一段时间后不再触发。似乎当前正在运行的警报会再触发一次,但不会设置新的警报。
我阅读了一些文档,很可能是关于 Marshmallow Doze 的。所以我实现了以下(并检查它是否实际正在执行):
Intent serviceIntent = new Intent(context, MyService.class);
PendingIntent pi = PendingIntent.getService(context, alarmId, serviceIntent,
PendingIntent.FLAG_UPDATE_CURRENT);
DateTime inMinutes = (new DateTime()).plusMinutes(minutes);
AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
if(Build.VERSION.SDK_INT >= 23)
am.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, inMinutes.getMillis(), pi);
else {
if(Build.VERSION.SDK_INT >= 19) {
am.setExact(AlarmManager.RTC_WAKEUP, inMinutes.getMillis(), pi);
} else {
am.set(AlarmManager.RTC_WAKEUP, inMinutes.getMillis(), pi);
}
}
它不会改变任何东西。
有没有一种可靠的方法可以在 Marshmallow 闲置一段时间后设置和触发警报?