在调用alarm.set()之前启动Android AlarmManager PendingIntent

时间:2017-01-20 02:32:06

标签: android alarmmanager android-pendingintent

我已经在这里读到了每个类似的问题,但找不到答案,所以请原谅我,如果之前已经回答过,我真的试着去搜索。

我正在设置闹钟以在一段时间后显示通知。时间逻辑肯定是可靠的,我可以通过我的日志输出来判断,这不是问题。

我创建了一个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毫秒后触发。在这种情况下,根据我的日志语句,millis407603959。绝对不应该在一秒钟之后开火。

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会在闹钟被触发之前启动?

1 个答案:

答案 0 :(得分:2)

您正在使用AlarmManager.RTC_WAKEUP的警报类型,它会将警报设置为在您的案例millis中的指定时间开始。

要将警报设置为在将来的某个时间段内启动,您需要使用这些类型的经过时间警报:

  • ELAPSED_REALTIME

SystemClock.elapsedRealtime()中的闹钟时间(启动后的时间,    包括睡觉)。此警报不会唤醒设备;如果它去了    当设备处于睡眠状态时关闭,直到设备处于休眠状态    下次设备唤醒时。

  • ELAPSED_REALTIME_WAKEUP

SystemClock.elapsedRealtime()中的闹钟时间(启动后的时间,    包括睡眠),它会在设备熄灭时唤醒它。

或者使用RTCRTC_WAKEUP与当前时间加上等待时间,例如:

alarm.set(AlarmManager.RTC_WAKEUP, Calendar.getInstance().getTimeInMillis() + millis, pi);