Search code examples
androidalarmmanagerandroid-pendingintent

alarmmanager 2 times


I have a BroadcastReceiver called AlarmReceiver that Toasts "alarm worked". I'm trying to set up a repeating PendingIntent to trigger AlarmReceiver at 5:45 and 17:30, but I see "alarm worked" after few seconds of starting the app. Why is the PendingIntent getting sent immediately?

 public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Calendar cal1 = Calendar.getInstance();
        cal1.set(Calendar.HOUR_OF_DAY, 05);
        cal1.set(Calendar.MINUTE, 45);
        cal1.set(Calendar.SECOND, 00);

        Calendar cal2 = Calendar.getInstance();
        cal2.set(Calendar.HOUR_OF_DAY, 17);
        cal2.set(Calendar.MINUTE, 30);
        cal2.set(Calendar.SECOND, 00);

        Intent intent = new Intent(this, AlarmReceiver.class);

        PendingIntent pi = PendingIntent.getBroadcast(getApplicationContext(), 0, intent,      PendingIntent.FLAG_UPDATE_CURRENT);
        alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, cal1.getTimeInMillis(),cal2.getTimeInMillis(), pi);


        Toast.makeText(this, "Alarm set", Toast.LENGTH_LONG).show();

    }


}

AlarmReceiver:

public class AlarmReceiver extends BroadcastReceiver {


        public void onReceive(Context context, Intent intent) {

            Toast.makeText(context, "Alarm worked.", Toast.LENGTH_LONG).show();

}

Solution

  • but I see "alarm worked" after few seconds of starts of my app.

    I believe you are receiving the first alarm just fine.

    But you believe it is not repeating. This wrong, it will repeat... once every ~43 years. You are using the third parameter of setRepeating incorrectly, try:

    Calendar cal1 = Calendar.getInstance(); // Now
    cal1.add(Calendar.SECONDS, 5); // Change to five seconds from now
    
    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, 
            cal1.getTimeInMillis(), 
            10000, /* Repeat every 10 seconds */ 
            pi);
    

    The third parameter is an interval. This code creates an alarm that goes off in 5 seconds, then repeats every 10 seconds. By using cal2 you are accidentally setting the interval to almost 43 years.


    To set two different alarms use:

    Calendar cal1 = Calendar.getInstance();
    cal1.set(Calendar.HOUR_OF_DAY, 05);
    cal1.set(Calendar.MINUTE, 45);
    cal1.set(Calendar.SECOND, 00);
    
    Calendar cal2 = Calendar.getInstance();
    cal2.set(Calendar.HOUR_OF_DAY, 17);
    cal2.set(Calendar.MINUTE, 30);
    cal2.set(Calendar.SECOND, 00);
    
    // Test if the times are in the past, if they are add one day
    Calendar now = Calendar.getInstance();
    if(now.after(cal1))
        cal1.add(Calendar.HOUR_OF_DAY, 24);
    if(now.after(cal2))
        cal2.add(Calendar.HOUR_OF_DAY, 24);
    
    // Create two different PendingIntents, they MUST have different requestCodes
    Intent intent = new Intent(this, AlarmReceiver.class);
    PendingIntent morningAlarm = PendingIntent.getBroadcast(getApplicationContext(), 0, intent, 0);
    PendingIntent eveningAlarm = PendingIntent.getBroadcast(getApplicationContext(), 1, intent, 0);
    
    // Start both alarms, set to repeat once every day
    AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, cal1.getTimeInMillis(), DateUtils.DAY_IN_MILLIS, morningAlarm);
    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, cal2.getTimeInMillis(), DateUtils.DAY_IN_MILLIS, eveningAlarm);