How to stop Android AlarmManager when there is a m

2019-09-10 03:49发布

Here is an extended example of the problem. It is 1:30AM. Alarm is set for later today, at 10AM. I change my phones time to 1159PM yesterday. Alarm Manager instantly triggers, at the wrong time.

How do I stop the AlarmManager from ringing if the time is in the past?

If however, I change the time forward, nothing happens.

I do not want this to happen with my app, as it does not happen with other Alarm apps. Is there a way to make sure that the Alarm manager only rings at the exact minute it is set (if not skip it)?

Here is my Alarm Manager code.

        Calendar alarmCal = closestAlarm.toCalendar();

        Intent alarmIntent = new Intent(this, ActiveAlarmService.class);
        alarmIntent.putExtra("alarm", closest);

        pendingAlarm = PendingIntent.getService(AlarmService.this, 0, alarmIntent, PendingIntent.FLAG_CANCEL_CURRENT);

        alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
        alarmManager.set(AlarmManager.RTC_WAKEUP, alarmCal.getTimeInMillis(), pendingAlarm);

I have tried using a BroadcasetReceiver to catch the Time/Date change events, but there is too much lag between the broadcast, and the AlarmManager firing because it is set in the past.

1条回答
再贱就再见
2楼-- · 2019-09-10 04:30

I have found the solution. It feels odd, but it is solid.

Here is what I was using originally.

alarmManager.set(AlarmManager.RTC_WAKEUP, 
    alarmTimeCalendar.getTimeInMillis(), pendingAlarmIntent);

This was the solution.

alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, alarmTimeCalendar.getTimeInMillis(),
    AlarmManager.INTERVAL_DAY, pendingAlarmIntent);

You will have to manage and cancel this AlarmManager as if it was the first method. If you forget, your alarm will ring when it should not.

查看更多
登录 后发表回答