Search code examples
androidandroid-alarms

How to set Repeating Alarm in Android using Recurrence Picker Dialog?


I am new to android developing, and i am working on Task Reminder App. I need to set repeating alarm for the task, and for that purpose, i am using Recurrence Picker Dialog.

But i don't know how to set multiple alarms based on the string returned by the recurrence picker dialog.

I am using the following recurrence picker dialog.

enter image description here

It returns a string in variable 'rrule', but i don't know how to use that string to set multiple alarms. Below is the code to set Listener for the picker.

recurrencePickerDialog.setOnRecurrenceSetListener(new RecurrencePickerDialog.OnRecurrenceSetListener() {
                        @Override
                        public void onRecurrenceSet(String rrule) {

                        }
                    });

recurrencePickerDialog.show(getSupportFragmentManager(),"recurrencePicker");

Anyone please help me. I would be thankful..


Solution

  • You can set alarms using Alarm Manager and a Custom Broadcast Receiver. You can set your alarm like this.

     @Override
     public void onRecurrenceSet(String rrule) {
    
         if (rrule != null && rrule.length() > 0) {
            EventRecurrence recurrenceEvent = new EventRecurrence();
            recurrenceEvent.setStartDate(new Time("" + new Date().getTime()));
            recurrenceEvent.parse(rrule);
    
          //Sets alarm
            Intent intent=new Intent(this,MyBroadcastReceiver.class);
            PendingIntent pendingIntent= PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
            AlarmManager alarmManager=(AlarmManager)getSystemService(ALARM_SERVICE);
            long offset=getNextOccurence(recurrenceEvent);
            alarmManager.set(AlarmManager.RTC_WAKEUP, Calendar.getInstance().getTimeInMillis()+offset,pendingIntent);
    
           //Then save the rule somewhere.
    
    
         } else {
          Lod.d("TEST","No recurrence");
         }
       }
    

    getNextOccurrence function

     /**
     * Get the milliseconds till next alarm
     * @param e
     * @return
     */
    private long getNextOccurrence(EventRecurrence e) {
        switch (e.freq) {
            case EventRecurrence.HOURLY://When alarm is hourly
                if(e.interval==0)//When set to 1 Hour
                    return 1000 * 60 * 60;
                return 1000 * 60 * 60 * e.interval;
            // TODO: Implement cases for other frequencies 
    
    
        }
        return 0;
    }
    

    Then, in your Broacast Receiver, do the following:

    1. Show Alarm
    2. Set next alarm to be on next occurrence (based on saved rule)

    Hope this helps you to get started.