Search code examples
androidalarmmanager

AlarmManager fires late or doesn't fire at all


Hi everybody I'm trying to learn how to use AlarmManager and BroadcastReceiver in Android. I'm having some problems with the AlarmManager: I'm setting two alarms at 1 minute distance, but only one fires and it is some minutes late (not predictable i guess).

Here's my main activity (i'm setting Alarms by tapping a button)

public class MainActivity extends AppCompatActivity {
    AlarmManager alarmManager;
    Intent intent;
    PendingIntent pendingIntent;
    AtomicInteger atomicInteger;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
        intent = new Intent(Constants.EXTENDED_DATA_STATUS);
        atomicInteger = new AtomicInteger();
        setContentView(R.layout.activity_main);

        Button startButton = (Button) findViewById(R.id.start_button);

        startButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int id = atomicInteger.incrementAndGet();
                pendingIntent = PendingIntent.getBroadcast(getApplicationContext(),id,intent,0);
                Calendar firstLullo = Calendar.getInstance();
                Calendar secondLullo = Calendar.getInstance();
                firstLullo.set(Calendar.HOUR_OF_DAY,10);
                firstLullo.set(Calendar.MINUTE,55);
                secondLullo.set(Calendar.HOUR_OF_DAY,10);
                secondLullo.set(Calendar.MINUTE,56);
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                    alarmManager.setExact(AlarmManager.RTC_WAKEUP,firstLullo.getTimeInMillis(),pendingIntent);
                    alarmManager.setExact(AlarmManager.RTC_WAKEUP,secondLullo.getTimeInMillis(),pendingIntent);
                }
                Log.d("ALARM","settato con id " + String.valueOf(id));
            }
        });
    }
}

My Receiver simply shows a Toast and makes the phone vibrate. Constants.EXTENDED_DATA_STATUS is a string from a Constants class and it's added to the intent-filter of my Reveiver in the Android Manifest.

What am i missing? I googled a lot and only found that i have to use setExact() but no luck..

Thanks in advance


Solution

  • Yes, of course the above code will trigger only one Alarm, because you are setting same id for both alarms.

    Alarm are identified and differentiated by their id in pendingintent.

    Use different id for different alarms

    Update Code:

    pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 1234 ,intent,0);
    alarmManager.setExact(AlarmManager.RTC_WAKEUP,firstLullo.getTimeInMillis(),pendingIntent);
    
    pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 5678, intent,0);
    alarmManager.setExact(AlarmManager.RTC_WAKEUP,secondLullo.getTimeInMillis(),pendingIntent);