Search code examples
androidalarmmanagerandroid-alarmsrepeatingalarm

AlarmManager firing alarm past the time it was set on the same day, setRepeating


So basically I have this code, time returns 24hour time and repeats the alarm daily.

public setAlarm(String time, Context context){
    String[] strTime;

    strTime = time.split(":");

    int hour, min, sec;
    //set when to alarm
    hour = Integer.valueOf(strTime[0]);
    min = Integer.valueOf(strTime[1]);
    sec = 0;

    Calendar cal = Calendar.getInstance();
    cal.set(Calendar.HOUR_OF_DAY, hour);
    cal.set(Calendar.MINUTE, min);
    cal.set(Calendar.SECOND, sec);
    //Create a new PendingIntent and add it to the AlarmManager
    Intent intent = new Intent(context, AlarmReceiverActivity.class);
    PendingIntent pendingIntent = PendingIntent.getActivity(context, 19248, intent, PendingIntent.FLAG_UPDATE_CURRENT);
    AlarmManager am = (AlarmManager) context.getSystemService(Activity.ALARM_SERVICE);
    am.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent);
}

Anyways, the problem is when I set the alarm 9am while the time is 9:10am, the alarm will go off. Why? I want it not to alarm if it is set past the system time. Ex. set the alarm at 9am while the system time is 9:10am


Solution

  • I got it working now. I added a checker of the alarm time and current time.

    public setAlarm(String time, Context context){
            String[] strTime;
    
            strTime = time.split(":");
    
            int hour, min, sec;
            //set when to alarm
            hour = Integer.valueOf(strTime[0]);
            min = Integer.valueOf(strTime[1]);
            sec = 0;
    
            long _alarm = 0;
            Calendar now = Calendar.getInstance();
            Calendar alarm = Calendar.getInstance();
            alarm.set(Calendar.HOUR_OF_DAY, hour);
            alarm.set(Calendar.MINUTE, min);
            alarm.set(Calendar.SECOND, sec);
    
            if(alarm.getTimeInMillis() <= now.getTimeInMillis())
                _alarm = alarm.getTimeInMillis() + (AlarmManager.INTERVAL_DAY+1);
            else
                _alarm = alarm.getTimeInMillis();               
    
            //Create a new PendingIntent and add it to the AlarmManager
            Intent intent = new Intent(context, AlarmReceiverActivity.class);
            PendingIntent pendingIntent = PendingIntent.getActivity(context, 19248, intent, PendingIntent.FLAG_CANCEL_CURRENT);
            AlarmManager am = (AlarmManager) context.getSystemService(Activity.ALARM_SERVICE);
            am.setRepeating(AlarmManager.RTC_WAKEUP, _alarm, AlarmManager.INTERVAL_DAY, pendingIntent);
        }