如果当天的警报时间过去,android会阻止警报服务的立即触发

Fla*_*dun 8 android alarmmanager android-alarms repeatingalarm

Alarm Manager的参考说明了这一点

如果指定的触发时间是过去的,则会立即触发警报.

我在申请中遇到了这个问题.这是我的警报管理器代码:

Intent myIntent = new Intent(getActivity(), DinnerAlarmReceiver.class);
                pendingDinnerIntent = PendingIntent.getBroadcast(getActivity(), 0, myIntent, 0);

                Calendar calendar = Calendar.getInstance();
                calendar.set(Calendar.HOUR_OF_DAY, hourOfDay);
                calendar.set(Calendar.MINUTE, minute);

                alarmManager.set(AlarmManager.RTC_WAKEUP,
                        calendar.getTimeInMillis(), pendingDinnerIntent);
Run Code Online (Sandbox Code Playgroud)

这个问题有解决方法吗?

- - -编辑 - - -

我写了一些代码来估计警报的设定时间是否在当前时间之前.以上部分有相应的变化:

Calendar calendar = Calendar.getInstance();
                long currentTime = calendar.getTimeInMillis();
                calendar.set(Calendar.HOUR_OF_DAY, hourOfDay);
                calendar.set(Calendar.MINUTE, minute);
                long setTime = calendar.getTimeInMillis();
                Timestamp setTimestamp = new Timestamp(setTime);
                Timestamp currentTimestamp = new Timestamp(currentTime);
                if (setTimestamp.after(currentTimestamp))
                {
                    alarmManager.set(AlarmManager.RTC_WAKEUP,
                            calendar.getTimeInMillis(), pendingDinnerIntent);
                }
                else
                {
                }
Run Code Online (Sandbox Code Playgroud)

我的应该是什么alarmManager来的情况下,setTimestamp是前currentTimestamp

Mik*_* M. 23

您不需要创建Timestamps.你可以用你的Calendar.

Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, hourOfDay);
calendar.set(Calendar.MINUTE, minute);

if(calendar.before(Calendar.getInstance())) {
    calendar.add(Calendar.DATE, 1);
}

alarmManager.set(AlarmManager.RTC_WAKEUP,
    calendar.getTimeInMillis(), pendingDinnerIntent);
Run Code Online (Sandbox Code Playgroud)

我还要提到的是,就KitKat而言,如果你的targetSdkVersion年龄是19岁或以上,那么该AlarmManager#set()方法并不准确.如果您希望闹钟在确切时间触发,则需要使用setExact*()方法.