Search code examples
androidnullalarmmanagerandroid-pendingintent

Pending intent is null after activity restart


I am making an application that uses AlarmManager.setInexactRepeating() method, that takes a PendingIntent as a paramater.

I start this by calling my setAlarm() method

public void setRepeatingAlarm() {

    Intent intent = new Intent(this, AlarmReceiver.class);
    String url = getAssembledUrl();
    intent.putExtra("url", url);
    pendingIntent = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

    alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), interval, pendingIntent);

}

and stop it by stopAlarm()

private void stopRepeatingAlarm() {

    alarmManager.cancel(pendingIntent);
    pendingIntent.cancel();

}

Works just fine. However when activity gets destroyed, and user decides to stop the alarm, obviously the pending intent is null, as it gets created in the setRepeatingAlarm() method that wasnt called during current activities life.

Whats the correct way to get around this?

I could be creating the pending intent in Activity.onCreate() and that would solve this problem, however I will not be able to start the alarm again as the pending intent got canceled and needs to be recreated again (i think, unless there is a way to check the intent was canceled that i dont know about)


Solution

  • Actually, as it turns out

    PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
    

    returns the same pending intent, if the intent is the same so, all i needed was

    private void stopRepeatingAlarm() {
    
        if(pendingIntent == null) {
            pendingIntent = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
        }
    
        alarmManager.cancel(pendingIntent);
    
    }