Ciammarica
Ciammarica

Reputation: 141

Android: How to stop repeating alarm without unsetting the alarm itself

I have an Android app where I need to trigger reminders everyday at the same time. The alarm must repeat every 5 minutes if ignored. If the user declares he read the reminder, by clicking an OK button, the alarm must stop repeating, until it is triggered the day after. So, I want the alarm to stop repeating after the user's confirmation, and I read that with AlarmManager I should use the cancel() method. But I don't want to delete the alarm for future days, I just want it to stop repeating until next trigger. In other words, I don't want the cancel() method to unset the alarm for the future days. Is it the default behavior of the cancel() method or do I have to cancel the alarm and then re-set it every time?

This is my code for setting the alarm:

public class AlarmSettingManager
    {
     private static Context context;

     // Constructor
     public AlarmSettingManager(Context c)
        {
         context = c;
        }


     private static class PrescriptionAlarmSetter extends AsyncTask<String, Void, Boolean>
        {
         SharedPrefManager sharedPrefManager = SharedPrefManager.getInstance(context);

         @Override
         protected Boolean doInBackground(String... strings)
            {
             // Get the list of prescriptions from SharedPreferences
             if(!sharedPrefManager.getPrescrizioneList().equals(""))
                {
                 try
                    {
                     JSONArray responseJsonArray = new JSONArray(sharedPrefManager.getPrescrizioneList());

                     int currentID = Constants.PRESCRIZIONE_ALARM_ID;

                     for(int j=0; j<responseJsonArray.length(); j++)
                        {
                         JSONObject singlePrescription = responseJsonArray.getJSONObject(j);

                         Prescrizione prescrizione = new Prescrizione
                            (
                             singlePrescription.getInt("id_prescrizione"),
                             singlePrescription.getInt("id_medico"),
                             singlePrescription.getInt("id_farmaco"),
                             singlePrescription.getInt("numero_pasticche"),
                             singlePrescription.getInt("totale_compresse"),
                             singlePrescription.getString("nome"),
                             singlePrescription.getString("ora_assunzione"),
                             singlePrescription.getString("posologia"),
                             singlePrescription.getString("suggerimenti")
                            );

                         // Start setting the alarm for current prescription
                         Intent alarmIntent = new Intent(context, AlarmBroadcastReceiver.class);

                         PendingIntent pendingIntent = PendingIntent.getBroadcast
                            (
                             context.getApplicationContext(),
                             currentID,
                             alarmIntent,
                             PendingIntent.FLAG_CANCEL_CURRENT
                            );

                         // put the RequestCode ID as extra in order to identify which alarm is triggered
                         alarmIntent.putExtra("id", currentID);

                         Calendar calendar = Calendar.getInstance();
                         calendar.setTimeInMillis(System.currentTimeMillis());

                         // Specify the time to trigger the alarm
                         calendar.set(Calendar.HOUR_OF_DAY, prescrizione.getIntHour());
                         calendar.set(Calendar.MINUTE, prescrizione.getIntMinutes());
                         calendar.set(Calendar.SECOND, 0);

                         AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);

                         // Set the time interval (in milliseconds) to repeat the alarm if the previous one was ignored
                         alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 300000L, pendingIntent);

                         currentID++;
                        }
                    }
                 catch(JSONException e)
                    {
                     e.printStackTrace();
                    }
                }

             return false;
            }


         @Override
         protected void onPostExecute(Boolean b)
            {
             super.onPostExecute(b);
            }
        }


     public boolean setAlarms()
        {
         AlarmSettingManager.PrescriptionAlarmSetter prescriptionAlarmSetter = new AlarmSettingManager.PrescriptionAlarmSetter();
         prescriptionAlarmSetter.execute();

         return true;
        }
    }

And this is the piece of code I'm going to adapt in order to cancel the alarm repeating:

Intent alarmIntent = new Intent(context, AlarmBroadcastReceiver.class);

PendingIntent pendingIntent = PendingIntent.getBroadcast
                            (
                             context.getApplicationContext(),
                             currentID,
                             alarmIntent,
                             0
                            );

AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);

alarmManager.cancel(pendingIntent);

Thanks.

Upvotes: 1

Views: 1677

Answers (2)

Joshua Briefman
Joshua Briefman

Reputation: 4031

The intention of the "cancel" option is to remove the alarm.

Your application should add a new alarm just as the original was setup.

You can find a nice example of implementing a full alarm in Android at the following link, including how to re-add it on device reboot.

Repeat Alarm Example In Android Using AlarmManager

Upvotes: 0

Vishwesh Jainkuniya
Vishwesh Jainkuniya

Reputation: 2839

At the time of cancelling alarm schedule a new alarm for the next day.

Upvotes: 0

Related Questions