我已经在这里读到了每个类似的问题,但找不到答案,所以请原谅我,如果之前已经回答过,我真的试着去搜索。
我正在设置闹钟以在一段时间后显示通知。时间逻辑肯定是可靠的,我可以通过我的日志输出来判断,这不是问题。
我创建了一个Pending意图:
Intent alarmIntent = new Intent(c, AlarmReceiver.class);
alarmIntent.putExtra("title", name);
alarmIntent.putExtra("location", building);
PendingIntent pi = PendingIntent.getBroadcast(c, 0, alarmIntent, 0);
然后将警报设置为在millis
毫秒后触发。在这种情况下,根据我的日志语句,millis
为407603959
。绝对不应该在一秒钟之后开火。
alarm.set(AlarmManager.RTC_WAKEUP, millis, pi);
Log.i("Alarm", "Alarm: " + name + " is set for: "
+ untilAlarm.getDays() + " days, " + untilAlarm.getHours() + " hours, "
+ untilAlarm.getMinutes() + " minutes from now. Or, " + millis
+ " milliseconds");
好像我的PendingIntent在闹钟设置之前被启动了。我试图像这样创建阻止警报:
Intent alarmIntent = new Intent(c, AlarmReceiver.class);
alarmIntent.putExtra("title", name);
alarmIntent.putExtra("location", building);
PendingIntent pi = PendingIntent.getBroadcast(c, 0, alarmIntent,
PendingIntent.FLAG_ONE_SHOT);
if (!name.equals("test") {
alarm.set(AlarmManager.RTC_WAKEUP, millis, pi);
//Log statement...
}
并且仍会触发test
的警报,但日志语句不会打印到控制台,这意味着永远不会调用alarm.set
。意图仍然被触发,并显示标题为“test”的通知。
为什么我的PendingIntent会在闹钟被触发之前启动?
答案 0 :(得分:2)
您正在使用AlarmManager.RTC_WAKEUP
的警报类型,它会将警报设置为在您的案例millis
中的指定时间开始。
要将警报设置为在将来的某个时间段内启动,您需要使用这些类型的经过时间警报:
SystemClock.elapsedRealtime()中的闹钟时间(启动后的时间, 包括睡觉)。此警报不会唤醒设备;如果它去了 当设备处于睡眠状态时关闭,直到设备处于休眠状态 下次设备唤醒时。
SystemClock.elapsedRealtime()中的闹钟时间(启动后的时间, 包括睡眠),它会在设备熄灭时唤醒它。
或者使用RTC
或RTC_WAKEUP
与当前时间加上等待时间,例如:
alarm.set(AlarmManager.RTC_WAKEUP, Calendar.getInstance().getTimeInMillis() + millis, pi);