So brechen Sie den Alarm vom AlarmManager ab

Lesezeit: 3 Minuten

Benutzeravatar von Vladimir Homola
Wladimir Homola

Ich habe dasselbe Problem wie dieses getroffen. Alarm aus AlarmManager löschen mit cancel() – Android

“Ich versuche, einen Alarm mit zwei verschiedenen Methoden zu erstellen und zu löschen, die beide zu unterschiedlichen Zeitpunkten in der Anwendungslogik aufgerufen werden.

Wenn ich jedoch die Methode cancel() von AlarmManager aufrufe, wird der Alarm nicht gelöscht.”

Um einzustellen:

            Intent myIntent = new Intent(getApplicationContext(),
                    SessionReceiver.class);
            PendingIntent pendingIntent = PendingIntent.getBroadcast(
                    getApplicationContext(), 1, myIntent, 0);

            AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);

            alarmManager.set(AlarmManager.RTC, now.getTimeInMillis(),
                    pendingIntent);

Zum Löschen:

    AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    Intent myIntent = new Intent(getApplicationContext(),
            SessionReceiver.class);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(
            getApplicationContext(), 0, myIntent, PendingIntent.FLAG_UPDATE_CURRENT);

    alarmManager.cancel(pendingIntent);

Dies entfernt jedoch nicht einen registrierten Alarm. Vielen Dank im Voraus.

Benutzeravatar von Daniel Nugent
Daniel Nugent

Der PendingIntent muss genau so erstellt werden, wie er beim Start des AlarmManagers war, und es sieht so aus, als ob das Hauptproblem darin besteht, dass Sie einen anderen RequestCode verwenden (null statt eins).

Für eine schnelle Lösung sollte dies funktionieren:

AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
Intent myIntent = new Intent(getApplicationContext(), SessionReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(
                                 getApplicationContext(), 1, myIntent, 0);

alarmManager.cancel(pendingIntent);

Um zu verwenden PendingIntent.FLAG_UPDATE_CURRENT Flagge, siehe unten:

Einstellung:

Intent myIntent = new Intent(getApplicationContext(), SessionReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(
                                getApplicationContext(), 1, myIntent, 
                                PendingIntent.FLAG_UPDATE_CURRENT);

AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);

alarmManager.set(AlarmManager.RTC, now.getTimeInMillis(), pendingIntent);

Stornieren:

AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
Intent myIntent = new Intent(getApplicationContext(), SessionReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(
                                getApplicationContext(), 1, myIntent, 
                                PendingIntent.FLAG_UPDATE_CURRENT);

alarmManager.cancel(pendingIntent);

  • Oh. Ich sehe das Problem. Ich hätte denselben requestCode verwenden sollen! Vielen Dank für deine Hilfe,

    – Wladimir Homola

    9. März 2015 um 3:39 Uhr


  • Können Sie mir bitte helfen, stackoverflow.com/questions/51542099/… @DanielNugent zu lösen

    – Zhu

    26. Juli 2018 um 15:25 Uhr

  • warum hat Google nicht implementiert, wie AlarmManager.cancel(int requestCode) ? Das Betriebssystem kümmert sich dann um den Rest der zugrunde liegenden Details wie App-Namespace. Sicher wäre eine benutzerfreundlichere API

    – Irgendwer irgendwo

    6. November 2018 um 13:14 Uhr

  • Der RequestCode ist also im Grunde eine Kennung für den Alarm?

    – Mitulát báti

    2. April 2019 um 20:43 Uhr

  • Nein: requestCode ist nicht die Kennung für den Alarm. Der PendingIntent ist der Bezeichner, und requestCode ist Teil der Schlüsselprops des PendingIntent (zusammen mit dem zugrunde liegenden Intent selbst, der seine eigenen Identifizierungsschlüssel hat).

    – Gabriel

    7. Juni 2019 um 13:18 Uhr

Anfangs funktionierte es auch für mich nicht. Nachdem ich viele Beiträge gesehen hatte, wurde mir klar, dass die ausstehende Absicht, die abgebrochen werden soll, dieselbe sein sollte wie die ursprüngliche ausstehende Absicht, die zum Planen des Alarms verwendet wurde. Die ausstehende Absicht, abgebrochen zu werden, sollte auf die gleiche Aktion und die gleichen Datenfelder eingestellt sein, falls vorhanden, die zum Einstellen des Alarms verwendet wurden. Nachdem ich die gleiche AKTION und die gleichen Datenwerte eingestellt habe, obwohl ich sie nicht verwende, habe ich nur den Alarm abgebrochen.

  • Das hat bei mir funktioniert. Ich habe FLAG_ONE_SHOT für ausstehend beim Einstellen des Alarms und FLAG_UPDATE_CURRENT beim Abbrechen verwendet. Das Ersetzen von FLAG_UPDATE_CURRENT durch FLAG_ONE_SHOT (das beim Einstellen des Alarms verwendet wurde) zum Abbrechen ergab das gewünschte Ergebnis

    – Trupti Nasit

    4. Mai 2022 um 7:13 Uhr


1443050cookie-checkSo brechen Sie den Alarm vom AlarmManager ab

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy