Search code examples
androidandroid-intentalarmmanager

How do I setup AlarmManager for different days?


I have almost finished a little alarm application in Android, it works fine, however, right now it only works to setup an alarm only for one day, but the design has been made to select different days, for example (monday, wednesday, friday). This is the way I setup the alarm:

Calendar cal = Calendar.getInstance();

//tPicker is a TimePicker
cal.set(Calendar.HOUR_OF_DAY, tPicker.getCurrentHour());
cal.set(Calendar.MINUTE, tPicker.getCurrentMinute());
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);   

AlarmManager alarmMgr = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
alarmMgr.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), pIntent(this));

//pIntent method
public static PendingIntent pIntent(Context context){
Intent intent = new Intent();
intent.setAction("myAlarm.intent.action.CLOCK");

return PendingIntent.getBroadcast(context, 0, intent,    PendingIntent.FLAG_UPDATE_CURRENT);
}

It works great as I said, but I don't know how to setup an alarm for each day I select in the application, I would appreciate your help, thank you!


Solution

  • You need to set the alarm manager 3 times (in case monday, wednesday and friday are selected).

    Code stolen from https://stackoverflow.com/a/19298186/2829009:

    cal1.set(Calendar.DAY_OF_WEEK,2);  //monday
    cal2.set(Calendar.DAY_OF_WEEK,4);  //wednesday
    cal3.set(Calendar.DAY_OF_WEEK,6);  //friday
    

    and then set the an alarm manager for every day:

    alarmMgr.set(AlarmManager.RTC_WAKEUP, cal1.getTimeInMillis(), pIntent(this)); 
    alarmMgr.set(AlarmManager.RTC_WAKEUP, cal2.getTimeInMillis(), pIntent(this));  
    alarmMgr.set(AlarmManager.RTC_WAKEUP, cal3.getTimeInMillis(), pIntent(this));  
    

    Edit:

    private static final MONDAY = 2;
    private static final WEDNESDAY = 4;
    private static final FRIDAY = 6;
    
    Calendar calMonday = Calendar.getInstance();
    
    //tPicker is a TimePicker
    calMonday.set(Calendar.HOUR_OF_DAY, tPicker.getCurrentHour());
    calMonday.set(Calendar.MINUTE, tPicker.getCurrentMinute());
    calMonday.set(Calendar.SECOND, 0);
    calMonday.set(Calendar.MILLISECOND, 0); 
    
    //now copy you calendar for the other days
    Calendar calWednesday = calMonday.clone();
    Calendar calFriday = calMonday.clone();
    
    //set week days
    calMonday.set(Calendar.DAY_OF_WEEK, MONDAY);
    calWednesday.set(Calendar.DAY_OF_WEEK, WEDNESDAY); 
    calFriday.set(Calendar.DAY_OF_WEEK, FRIDAY); 
    
    AlarmManager alarmMgr = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
    alarmMgr.set(AlarmManager.RTC_WAKEUP, calMonday.getTimeInMillis(), pIntent(this, MONDAY));
    alarmMgr.set(AlarmManager.RTC_WAKEUP, calWednesday.getTimeInMillis(), pIntent(this, WEDNESDAY));
    alarmMgr.set(AlarmManager.RTC_WAKEUP, calFriday.getTimeInMillis(), pIntent(this, FRIDAY));
    
    //pIntent method
    public static PendingIntent pIntent(Context context, int id){
        Intent intent = new Intent();
        intent.setAction("myAlarm.intent.action.CLOCK");
    
        return PendingIntent.getBroadcast(context, id, intent,    PendingIntent.FLAG_UPDATE_CURRENT);
    }