Englisch version   English version


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

Benutzeroberfläche

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:

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.

Komponenten

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.

Code

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.

Erzeugen der Alarmbenachrichtigung (cmdDelayed.Click)

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.

Löschen von veralteten Datenbankeinträgen (Funktion RemoveOldAlarms)

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.

Anzeige aktualisieren (Funktion FillPendingAlarms)

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.

Alarm löschen (cmdDelX.Click)

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.