Search code examples
androidalarmmanagerrepeatingalarm

Daily Repeating Alarm not working


I'm trying to set a daily repeating Alarm using Alarmmanager and BroadcastReciever, but alarm is not getting fired properly.

I'm using below code to set the alarm when App is installed first time :

    checkFirstTime = getSharedPreferences("firstRun", 0);
    db = new DatabaseHandler(this); 
    if (checkFirstTime.getBoolean("my_first_time", true))
    {
        db = new DatabaseHandler(this);
        db.InitializeAll();    
        checkFirstTime.edit().putBoolean("my_first_time", false).commit(); 

        //To set alarm manager
        setAlarmManager();

        Toast.makeText(context, "alarm set", Toast.LENGTH_LONG).show();


    }

Function SetAlarm :

private void setAlarmManager()
    {

          Calendar calendar = Calendar.getInstance();
          calendar.setTimeInMillis(System.currentTimeMillis());
          calendar.set(Calendar.HOUR_OF_DAY, 12);
          calendar.set(Calendar.MINUTE, 00);
          calendar.set(Calendar.SECOND, 0);
          calendar.set(Calendar.AM_PM, 0);

          AlarmManager alarmMgr;

        alarmMgr = (AlarmManager)this.getSystemService(Context.ALARM_SERVICE);
          Intent intent = new Intent("com.example.testaclrtn");
          PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0,
                    intent, PendingIntent.FLAG_UPDATE_CURRENT);



          Calendar now = Calendar.getInstance();
          long calendarTime= 0;

          if(calendar.getTimeInMillis() <= now.getTimeInMillis())
                calendarTime = calendar.getTimeInMillis() + (AlarmManager.INTERVAL_DAY+1);
            else
                calendarTime = calendar.getTimeInMillis() ;

          alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP, calendarTime,
                  AlarmManager.INTERVAL_DAY, pendingIntent);

    }

and BroadcastReciever contains the following code:

 public class AlarmReceiver extends BroadcastReceiver {

    SharedPreferences storeDay;
    DatabaseHandler db;


    @Override
    public void onReceive(Context context, Intent intent)
    {

            Toast.makeText(context, "Alarm worked.", Toast.LENGTH_LONG).show();
            db = new DatabaseHandler(context);
            whenNextDay();

            Message msgToActivity = new Message();
            msgToActivity.what = 5;


     }

    public void whenNextDay()
    {
        int count = db.getPickCount(2);
        int target = db.getPickTarget(2);
        long time = db.getTimeCount(2);
        db.updatePickCount(3, count);
        db.updatePickTarget(3, target);
        db.updateTimeCount(3, time);

        count = db.getPickCount(1);
        target = db.getPickTarget(1);
        time = db.getTimeCount(1);
        db.updatePickCount(2, count);
        db.updatePickTarget(2, target);
        db.updateTimeCount(2, time);

        db.updatePickCount(1, 0);
        db.updateTimeCount(1, 0);
        db.close();


    }

Please help me to figure out what is wrong with my logic or code used. Thanks


Solution

  • Use this function to set repeating alarm, which triggers every 24 hours:

    public static void setRepeatingSync(Context context) {
        try {
    
       AlarmManager alarmMgr = (AlarmManager) context
                    .getSystemService(Context.ALARM_SERVICE);
            Intent intent = new Intent(context, AlarmReceiver.class);
            PendingIntent alarmIntent = PendingIntent.getBroadcast(context, 0, intent,
                    PendingIntent.FLAG_UPDATE_CURRENT);
            alarmMgr.setInexactRepeating(AlarmManager.RTC_WAKEUP,
                    System.currentTimeMillis(), (24 * 1000 * 60 * 60),
                    alarmIntent); //every 24 hours
        } catch (Exception e) {
            e.printStackTrace();
        }
    }