Wenn meine App gestartet wird, soll überprüft werden, ob ein bestimmter Alarm (über AlarmManager registriert) bereits eingestellt ist und ausgeführt wird. Die Ergebnisse von Google scheinen darauf hinzudeuten, dass dies nicht möglich ist. Ist das noch richtig? Ich muss diese Überprüfung durchführen, um den Benutzer zu informieren, bevor Maßnahmen zum Erstellen eines neuen Alarms ergriffen werden.
231
Antworten:
Im Anschluss an den Kommentar, den Ron gepostet hat, finden Sie hier die detaillierte Lösung. Angenommen, Sie haben einen sich wiederholenden Alarm mit einer ausstehenden Absicht wie folgt registriert:
Sie können überprüfen, ob es aktiv ist:
Der Schlüssel hier ist der
FLAG_NO_CREATE
, wie im Javadoc beschrieben:if the described PendingIntent **does not** already exists, then simply return null
(anstatt einen neuen zu erstellen)quelle
alarmManager.cancel(pendingIntent)
undpendingIntent.cancel()
um diese Lösung zu return false.Für andere, die dies benötigen, ist hier eine Antwort.
Verwenden
adb shell dumpsys alarm
Sie können wissen, dass der Alarm eingestellt wurde und wann sie alarmiert werden und in welchem Intervall. Auch wie oft dieser Alarm ausgelöst wurde.
quelle
adb shell dumpsys alarm | grep <e.g. package name of your app>
auch auf neuen Windows-Systemen (ich benutze Win10)Arbeitsbeispiel mit Empfänger (die beste Antwort war nur mit Aktion).
Es ist erwähnenswert:
Kurz gesagt, Ihr PendingIntent sollte über dieselben Funktionen (Operation und Intent-Struktur) verfügen, um die Kontrolle darüber zu übernehmen.
quelle
Beachten Sie dieses Zitat aus den Dokumenten für die festgelegte Methode des Alarm Managers:
Wenn Sie wissen, dass der Alarm eingestellt werden soll, müssen Sie nicht prüfen, ob er bereits vorhanden ist oder nicht. Erstellen Sie es einfach jedes Mal, wenn Ihre App startet. Sie werden alle früheren Alarme durch dieselben ersetzen
Intent
.Sie benötigen einen anderen Ansatz, wenn Sie berechnen möchten, wie viel Zeit für einen zuvor erstellten Alarm noch verbleibt, oder wenn Sie wirklich wissen müssen, ob ein solcher Alarm überhaupt vorhanden ist. Um diese Fragen zu beantworten, sollten Sie zum Zeitpunkt der Erstellung des Alarms freigegebene Voreinstellungsdaten speichern. Sie können den Zeitstempel der Uhr zum Zeitpunkt der Alarmeinstellung, die Zeit, zu der der Alarm ausgelöst werden soll, und die Wiederholungsperiode (wenn Sie einen Wiederholungsalarm einrichten) speichern.
quelle
Ich habe 2 Alarme. Ich verwende Absichten mit Extras anstelle von Aktionen, um die Ereignisse zu identifizieren:
Die Sache ist, dass mit Diff-Extras die Absicht (und der Alarm) nicht eindeutig sein wird. Um zu erkennen, welcher Alarm aktiv ist oder nicht, musste ich diff
requestCode
-s definieren :und so wurde Alarm erzeugt:
quelle
PendingIntent.getService
Habe gerade eine andere Lösung gefunden, es scheint für mich zu funktionieren
quelle
Während fast jeder hier die richtige Antwort gegeben hat, hat niemand erklärt, auf welcher Grundlage die Alarme funktionieren
Sie können tatsächlich mehr darüber erfahren ,
AlarmManager
und seine Arbeit hier . Aber hier ist die schnelle AntwortSie sehen im
AlarmManager
Grunde Zeitpläne aPendingIntent
irgendwann in der Zukunft. Um den geplanten Alarm abzubrechen, müssen Sie den Alarm abbrechenPendingIntent
.Beachten Sie beim Erstellen des immer zwei Dinge
PendingIntent
PendingIntent
Um zu überprüfen, ob der Alarm bereits geplant ist, oder um den Alarm abzubrechen, müssen Sie nur noch auf denselben zugreifen
PendingIntent
. Dies kann erfolgen, wenn Sie denselben Anforderungscode verwenden undFLAG_NO_CREATE
wie unten gezeigt verwendenMit
FLAG_NO_CREATE
wird zurückgegeben,null
wenn dasPendingIntent
noch nicht existiert. Wenn es bereits vorhanden ist, wird ein Verweis auf das vorhandene zurückgegebenPendingIntent
quelle
Ich habe ein einfaches (dummes oder nicht dummes) Bash-Skript erstellt, das die Longs aus der ADB-Shell extrahiert, sie in Zeitstempel konvertiert und rot anzeigt.
Versuch es ;)
quelle
FLAG_NO_CREATE erstellt keine ausstehende Absicht, sodass der boolesche Wert false angegeben wird.
Nachdem der AlarmManager den Wert von Pending Intent überprüft hat, gibt er true aus, da AlarmManager das Flag für Pending Intent aktualisiert.
quelle
Ich habe den Eindruck, dass es keine Möglichkeit gibt, dies zu tun, aber es wäre schön.
Sie können ein ähnliches Ergebnis erzielen, indem Sie irgendwo eine Alarm_last_set_time aufzeichnen lassen und einen On_boot_starter BroadcastReciever: BOOT_COMPLETED.
quelle