Beispiel Notification Alarm Test |
In diesem Beispiel wird gezeigt, wie Benachrichtigungen generiert werden können, die zu bestimmten Zeiten erscheinen. Außerdem wird gezeigt, wie solche Benachrichtigungen verwaltet werden können.
Generierte Benachrichtigungen | Benutzeroberfläche der App |
Nach Antippen der Schaltfläche Create notification alarm wird eine neue Alarm-Benachrichtigung erstellt mit den Werten für Text und Verzögerung aus den darüber liegenden Eingabefeldern.
Leider gibt es in Android keine Möglichkeit, ausstehende Alarm-Objekte zu ermitteln. Alarmzeitpunkt und ID des Alarms werden deshalb in einer Datenbank (TinyDB) abgelegt. Die Datenbank wird regelmäßig synchronisiert:
Nach jeder Betätigung einer Schaltfläche wird überprüft, welche Alarmzeitpunkte abgelaufen sind und diese aus der Datenbank gelöscht.
Von den in der Datenbank befindlichen ausstehenden Alarme werden jeweils die ersten fünf auf der Oberfläche angezeigt. Zur Anzeige der Alarme werden die notwendigen Container (HorizotalArrangement) sichtbar geschaltet und die enthaltenen Felder gefüllt.
In dem Projekt sind folgende Instanzen der Komponenten angelegt.
Typ | Name | Funktion | |
---|---|---|---|
UrsAI2NotificationChannel | Channel | Benachrichtigungskanal. | |
UrsNotification | DelayedNotification | Die Benachrichtigung, die zum Alarmzeitpunkt erzeugt werden soll. | |
UrsIntent | LaunchScreenIntent | Intent, der den Screen Notification öffnet. | |
Clock | Clock1 | Timer zum regelmäßigen Update der Liste der ausstehenden Alarme. | |
TinyDB | DBAlarm | Datenbank zum verwalten der ausstehenden Alarme. |
Bei Benachrichtigungen, die über den Alarmmanager generiert werden, kommt eine weitere ID hinzu, der RequestCode. Er kennzeichnet Auftrag an den Alarmmanager und hat prinzipiell nichts mit der ID der Benachrichtigung zu tun. Ein neuer Alarm mit einem RequestCode, der identisch mit einem bestehenden ist, aktualisiert den bestehenden Alarmauftrag.1) Eine Benachrichtigung mit einer gleichen ID (Feld NumberID) aktualisiert eine bereits angezeigte Benachrichtigung. Somit ist es also möglich mit einem späteren, zweiten Alarm (anderer RequestCode) eine bereits angezeigte Benachrichtigung (gleicher NumberID) zu aktualisieren, z.B. um ihr einen neuen Text anzuzeigen.
1) Android erlaubt auch ein anderes Verhalten. In dieser Extension wird jedoch das Flag PendingIntent.FLAG_UPDATE_CURRENT gesetzt, das eine Aktualisierung eines bestehenden Auftrags bewirkt.
Bei diesem Beispiel ist eine Aktualisierung der Benachrichtigungen nicht vorgesehen (s. Beispiel Remember URS). RequestCode und NumberID erhalten die gleichen Werte, was den Code etwas vereinfacht.
In der globalen Variablen RequestCode wird die eindeutige ID für die Alarmbenachrichtigung verwaltet. Diese wird inkrementiert, um eine neue ID zu erhalten. Die Felder Text und NumberID des UrsNotification-Objekts DelayedNotification werden mit den Werten aus den Eingabefelder aktualisiert. Die Alarmbenachrichtigung wird durch die Methode CreateAlarmEx erstellt. Diese liefert den Alarmzeitpunkt zurück. Der Alarmzeitpunkt und die ID des Alarms (RequestCode) werden in der Datenbank abgelegt.
Der Schlüssel der Datenbankeinträge (Tag) ist der Alarmzeitpunkt. Die Schlüssel werden ausgelesen und mit der aktuellen Systemzeit verglichen. Veraltete Einträge werden aus der Datenbank gelöscht.
Die Komponenten, die zur dynamischen Anzeige dienen, werden in Listen eingetragen. Dies ermöglich den indizierten Zugriff.
Nach Betätigung einer Schaltfläche oder zeitgesteuert erfolgt die Aktualisierung der Anzeige der ausstehenden Alarme.
Zunächst wird die Datenbank aktualisiert und alle Zeilen auf nicht sichtbar geschaltet. Über die lokale Variable cnt wird mitgezählt, welche Zeile gerade bearbeitet wird. Bei einem Wert größer als fünf werden keine weiteren Datensätze berücksichtigt. Im unsichtbaren Label lblTagX wird der Datenbankschlüssel hinterlegt und das Label lblAlarmX erhält die formatierten Zeitangabe. Zuletzt wird das HorizontalArrangement haAlarmX sichtbar geschaltet.
Dieser Code ist identisch für alle Lösch-Schaltflächen. Über die Methode CancelAlarm wird der Alarm gelöscht. Der Schlüssel (RequestCode) wurde vorher in dem nicht sichtbaren Label lblTagX abgelegt. Der gelöschte Alarm wird ebenfalls aus der Datenbank entfernt und die Anzeige aktualisiert.