Search code examples
androidsqlitealarmmanagerandroid-pendingintentandroid-alarms

Alarm is ringing for all prevoius times using AlarmManager


I am setting Alarm using Alarm Manager And setting this Alarm By Picking Values from SQlite Database.The Alarm is working fine for future Alarms but the problem is when I open the Activity in which Alarm Function is Called, The Alarm Start ringing for All Previous Times. How Should I solve this problem ? Here is My Alarm Function

     void Alaramset()
{
    Cursor cursor=mydb.getAllData();



     if (cursor.moveToFirst())
     {
         do{
             String alarm1 = cursor.getString     (cursor.getColumnIndex(DBHelper.ALARM_COLUMN_REMINDER1));
             int id = Integer.parseInt(cursor.getString(cursor.getColumnIndex(DBHelper.ALARM_COLUMN_ID)));
                int minute=Integer.parseInt       (alarm1.substring(3, 5));
                int hr=Integer.parseInt(alarm1.substring(0, 2));
    Intent myIntent =  new Intent(getActivity(), MyAlaramService.class);
    myIntent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
    PendingIntent pendingIntent = PendingIntent.getService(getActivity(), id, myIntent, PendingIntent.FLAG_UPDATE_CURRENT);
    AlarmManager alarmManager =  (AlarmManager)getActivity().getSystemService(Context.ALARM_SERVICE);
         //       Toast.makeText(getActivity(), ""+minute+" : "+hr, 300).show();
      Calendar calendar = Calendar.getInstance();
      calendar.setTimeInMillis(System.currentTimeMillis());
     calendar.set(Calendar.HOUR_OF_DAY, hr);
       calendar.set(Calendar.MINUTE, minute);
        calendar.set(Calendar.SECOND, 0);
       alarmManager.setExact(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
         }
         while (cursor.moveToNext());
     }
}

Solution

  • It looks like you are scheduling alarms that happen in the past. Any alarm scheduled in the past will trigger immediately. A simple solution would be to schedule past alarms for the next day.

    Calendar now = Calendar.getInstance();
    now.setTimeInMillis(System.currentTimeMillis());
    if (calendar.before(now) {
       // alarm has already happened. schedule it for tomorrow
       calendar.add(Calendar.Date, 1);
    } 
    alarmManager.setExact(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),    pendingIntent);