Version Anpassungen
1.0 (2020-09-07) Initiale Version

In­halts­ver­zeich­nis

Download

Über ...

Verwendung

UrsAI2NotificationChannel

Referenz

UrsNotification

Referenz

UrsIntent

Referenz

Beispiele

UrsNotificationTest

Remember URS

UrsNotoficationAlarm

Werkzeuge


Hinweise (Erfahrungen mit meinem Redmi 5 Plus, Android Oreo 8.1.0):

Generelle App-Einstellungen zu Benachrichtigungen, z.B. ob Töne erlaubt sind, hängen davon an, mit welchen Eigenschaften der erste Benachrichtigungskanal zu der App angelegt wurde. Nachträglich können diese generellen Eigenschaften nur noch manuell vom Anwender geändert werden. Selbst durch eine Deinstallation und erneute Installation bin ich einmal angelegte Benachrichtigungskanäle nicht wieder los geworden.

Bei meinem Smartphone ist es mit nicht gelungen, Töne oder Vibrationen per Programm zu aktivieren, obwohl dies per Beschreibung möglich sein sollte. Ich musste beides manuell freigeben.

Töne lassen sich mit dieser Extension nicht individuell einstellen. Das liegt u.a. daran, dass die Unterstützung von ContentProvidern durch App Inventor noch nicht ausreichend ist. Die Inspektion des NotficationChannel-Objekts hat jedoch gezeigt, dass die Einstellungen korrekt sind. Offensichtlich gibt weitere Einstellungen auf dem Gerät, die die Vibration verhindern.

Download

Das ZIP-Archiv UrsAI2Notify zum Download. Das Archiv enthält den Quellcode, das kompilierte Binary zum Upload in den App Inventor und eine Beispiel-Anwendung.

Über ...

Eine Übersicht zu den Benachrichtigungen findet man in der Android Dokumentation: Übersicht zu Benachrichtigungen.

Mit dem API-Level 26 (Version Oreo 8.0) hat Android das Konzept der Benachrichtigungskanäle eingeführt (NotificationChannel, bei manchen Geräten auch Benachrichtigungskategorien genannt). Sämtliche Benachrichtigungen müssen einem solchen Kanal zugeordnet werden.

Das Benachrichtigungskonzept ist relativ komplex. Android erlaubt es, Einstellungen sowohl auf der Geräteebene, als auch auf der Kanalebene und bei den Benachrichtigungen selbst vorzunehmen.

Viele Eigenschaften der Benachrichtigungen, z.B. die Wichtigkeit oder das Vibrationsmuster, werden auf der Kanal-Ebene festgelegt. Diese Eigenschaften werden von der App bei der Anlage des Kanals festgelegt und sind danach nicht mehr änderbar. Der Benutzer hat vollen Zugriff auf die meisten der Kanalattribute und kann sie nach belieben modifizieren. Die Modifikationen durch den Benutzer sollen nicht überschrieben werden. Deshalb können sie nachträglich nicht mehr per Programm geändert werden können.  Das geht sogar soweit, dass, wenn eine Kanal gelöscht und anschließend wieder angelegt, er mit den zuletzt vorhandenen Einstellungen erzeugt wird. Das "Löschen" ist praktisch nur ein Verstecken. Lediglich die Eigenschaften Name und Description eines Kanals lassen sich nachträglich ändern. Die Beseitigung von Schreibfehler wäre ansonsten unmöglich.

Will man andere Eigenschaften ändern, muss ein neuer Kanal (neue Channel-ID) verwendet werden. Den bestehenden Kanal löscht man sinnvollerweise beim Start der App mit NotificationChannel.DeleteChannel.

Man sollte sich also sehr gut überlegen, welche Eigenschaften einem Kanal zugewiesen werden.

Verwendung

Die App Inventor Extension UrsAi2Notification ermöglicht es, Android Benachrichtigungen zu erstellen. Es werden drei Komponenten zur Verfügung gestellt:

UrsAI2NotificationChannel

Android Versionen älter als API Level 26 kennen keine Benachrichtigungskanäle. Benachrichtigungen werden ohne Kanäle angelegt. Funktionen, die sich auf Kanäle beziehen sind wirkungslos.

Der NotificationChannel wird automatisch direkt nach dem Start der App angelegt. Man muss sich nicht selbst darum kümmern. Im Designer-Fenster können die Eigenschaften des Benachrichtigungskanals festgelegt werden. Da die Eigenschaften des Kanals nach dessen Erstellung nicht mehr geändert werden können, gibt es keine entsprechenden Methoden für die Modifikation zur Laufzeit.

Besondere Achtung ist der Einstellung des Importance-Levels zu schenken. Hiervon hängt es ab, welche generellen (kanal-unabhängigen) Einstellungen die Benachrichtigungen erhalten. Wie oben im Hinweis schon erwähnt, werden diese durch den als erstes angelegten Kanal festgelegt. Der Artikel Set the Importance Level in der Android-Dokumentation gibt die Details dazu.

UrsAI2NotificationChannel stellt folgende Funktionen zur Erzeugung von Benachrichtigungen bereit:

Benachrichtigungen muss man auch wieder löschen können:

Die Methode DeleteChannel versteckt einen bereits angelegten Benachrichtigungskanal.

Es ist unüblich den Namen (ChannelName) und die Beschreibung (Description) zu einem Kanal per Programm oder durch den Benutzer zu ändern. I.d.R. erfolgt dies nur durch ein Update der App. Enthält das Update neue Werte für diese Eigenschaften, werden diese Kanaleigenschaften automatisch beim Start des Programm angepasst.

Nicht implementiert sind Benachrichtigungskanalgruppen und individuelle Benachrichtigungstöne (s.o.).

Referenz

Designer Bezeichnung Typ Funktion Voreinstellung
BypassDnd boolean Legt fest, ob an diesen Kanal gesendete Benachrichtigungen den Benutzer im Modus NotificationManager.INTERRUPTION_FILTER_PRIORITY unterbrechen können. false
ChannelID String Die ID des Kanals. Die ID muss pro App eindeutig sein. Der Wert kann abgeschnitten werden, wenn er zu lang ist. "UrsNotificationChannel"
Description String Die für den Benutzer sichtbare Beschreibung dieses Kanals. -none-
Importance int Die Bedeutsamkeit des Kanals. NotificationManager.
  IMPORTANCE_DEFAULT
LightsEnabled boolean Legt fest, ob ein optisches Signal für auf diesem Kanal gepostete Benachrichtigungen angezeigt werden sollen, wenn das Gerät diese Funktion unterstützt.
Hinweis: Die LED wird nur angeschaltet, wenn das Display ausgeschaltet ist.
false
LightColor Color Legt, sofern vom Gerät unterstützt, die Farbe des optischen Signals fest. Component.COLOR_DEFAULT
LockscreenVisibility int

Legt fest, ob auf diesem Kanal veröffentlichte Benachrichtigungen auf dem Sperrbildschirm angezeigt werden oder nicht, und wenn ja, ob sie in redigierter Form angezeigt werden:

none
ShowBadge boolean Legt fest, ob auf diesem Kanal veröffentlichte Benachrichtigungen das Launcher-Icon mit Plaketten versehen werden soll. false
SoundEnabled(s.o.) boolean Legt fest, ob zu den an diesen Kanal gesendete Benachrichtigungen der Standardton wiedergeben werden soll. false
VibrationEnabled(s.o.) boolean Legt fest, ob die auf diesem Kanal veröffentlichte Benachrichtigung vibrieren soll. false
VibrationPattern(s.o.) CSV-String Legt das Vibrationsmuster für Benachrichtigungen fest, die an diesen Kanal gesendet werden.
Komma-separierte Liste von Millisekunden, beginnend mit einer Pause-Zeit.

Kann das Pattern nicht aufgelöst werden, wird beim Start der App das Ereignis  Screen.ErrorOccurred mit ErrorNumber 17002 ausgelöst. Der Kanal wird nicht angelegt!
-none-

 

Methode Funktion Anmerkung
Erstellt eine einfache Benachrichtigung ohne eine auszuführende Aktion.

NumberID: eindeutige ID der Benachrichtigung.
Icon: kleines Icon, das angezeigt werden soll.
Title: erste Zeile der Benachrichtigung.
Text: zweite Zeile.
Icon ist entweder die Name einer hochgeladenen Grafik (erst ab API Level 23) oder der Name eines System-Icons.

Es wird das Attribut AutoCancel gesetzt. Damit verschwindet die Nachricht wieder, wenn der Anwender die Nachricht antippt.

Wird eine zweite Benachrichtigung mit der gleichen ID erstellt, bevor die vorhergehende gelöscht wurde, wird diese aktualisiert.
wie oben.

Beim Antippen der Benachrichtigung wird der im UrsIntentObjekt übergebene Auftrag ausgeführt.
Wenn das übergebene Objekt im Parameter UrsIntentObject nicht vom Typ UrsIntent ist, wird die Benachrichtigung nicht angelegt und Screen.ErrorOccurred mit ErrorNumber 17006 ausgelöst.
Erstellt eine Benachrichtigung, die beim Antippen die AI2-App öffnet, mit der die Benachrichtigung erstellt wurde.

NumberID, Icon, Title, Text: s.o.
ScreenToOpen: Aktion, die beim Antippen der Benachrichtigung ausgelöst wird.
StartValue: Startwert für AI2-Apps.
AutoCancel: Die Benachrichtigung soll beim Antippen gelöscht werden.
s.o.

Wenn ScreenToOpen leer bleibt, wird "Screen1" eingesetzt.

ScreenToOpen kann entweder einen Screen-Namen der App enthalten oder den vollständig klassifizierten Klassennamen einer beliebigen Activity.

Kann der aufzurufende Screen oder die Activity-Klasse nicht gefunden werden, wird die Benachrichtigung nicht angelegt und Screen.ErrorOccurred mit ErrorNumber 17004 ausgelöst.

Wenn StartValue leer bleibt, wird "NOTIFICATION"+<NumberID> eingesetzt.

Der auszuführende Intent wird mit diesen Flags versehen:
FLAG_ACTIVITY_NEW_TASK,
FLAG_ACTIVITY_MULTIPLE_TASK,
FLAG_ACTIVITY_NO_ANIMATION
Erstellt eine Benachrichtigung.
UrsNotificationObjekt
: legt die Eigenschaften der Benachrichtigung fest.
UrsIntentObject: legt fest, welche Aktion beim Antippen der Benachrichtigung ausgeführt.
Wenn das übergebene Objekt im Parameter UrsNotificationObject nicht vom Typ UrsNotification ist, wird die Benachrichtigung nicht angelegt und Screen.ErrorOccurred mit ErrorNumber 17005 ausgelöst.

Wenn das übergebene Objekt im Parameter UrsIntentObject nicht vom Typ UrsIntent ist, wird die Benachrichtigung nicht angelegt und Screen.ErrorOccurred mit ErrorNumber 17006 ausgelöst.
Erstellt eine mit Verzögerung angezeigte Benachrichtigung.
RequestCode: Eindeutige numerische ID für diesen Alarm.
Delay: Verzögerung in Sekunden.
Type: Angabe der Genaugkeit.
WakeUp: will wake up the device when it goes off.
Weckt das Gerät auf, wenn die Zeit abgelaufen ist.
UrsNotificationObjekt: legt die Eigenschaften der Benachrichtigung fest.
UrsIntentObject: legt fest, welche Aktion beim Antippen der Benachrichtigung ausgeführt.

Type ermöglicht die Angaben 0..3. Es werden die folgenden Methoden aufgerufen:

  • 0: AlarmManager.set (ab API Level 1)
    Ab API 19 wird die an diese Methode übergebene Auslösezeit als ungenau behandelt: Der Alarm wird nicht vor dieser Zeit übermittelt, kann jedoch verschoben und einige Zeit später übermittelt werden.
  • 1: AlarmManager.setExact (ab API Level 19)
    Der Alarm wird so weit wie möglich zur gewünschten Zeit ausgelöst.
  • 2: AlarmManager.setAndAllowWhileIdle (ab API Level 23)
    Dieser Alarm wird auch dann ausgeführt, wenn sich das System im Leerlaufmodus (doze mode) befindet.
  • 3: AlarmManager.setExactAndAllowWhileIdle (ab API Level 23)
    Der Alarm wird so weit wie möglich zur gewünschten Zeit ausgelöst, auch dann, wenn sich das Gerät im Leerlaufmodus (doze mode) befindet.

Reicht der aktuelle API-Level nicht aus, wird der Typ angepasst:
10; 20; 310;

Wenn der Wert für Delay kleiner als Null ist, wird die Benachrichtigung nicht angelegt und Screen.ErrorOccurred mit ErrorNumber 17007 ausgelöst.

Wenn das übergebene Objekt im Parameter UrsNotificationObject nicht vom Typ UrsNotification ist, wird die Benachrichtigung nicht angelegt und Screen.ErrorOccurred mit ErrorNumber 17005 ausgelöst.

Wenn das übergebene Objekt im Parameter UrsIntentObject nicht vom Typ UrsIntent ist, wird die Benachrichtigung nicht angelegt und Screen.ErrorOccurred mit ErrorNumber 17006 ausgelöst.

Wie CreateAlarm.

Es wird der Auslösezeit in Millisekunden seit 1.1.1970 zurück geliefert.
Dieser Wert kann z.B. an die Methode MakeInstantFromMillis einer Clock-Komponente zur Erstellung eines lesbaren Datum-Zeit-Format übergeben werden.

Analog zu  CreateAlarm.

Millis: der Alarmzeitpunkt in Millisekunden seit dem 1.1.1970.
Der Wert für Millis kann aus einer Clock-Komponente über die Methode GetMillis gewonnen werden.

Löscht eine einzelne Benachrichtigung. Benachrichtigungen, die mit einem ForegroundService verbunden sind, werden nicht gelöscht (s. UrsKeepAlive).
Löscht alle Benachrichtigungen der App. Benachrichtigungen, die mit einem ForegroundService verbunden sind, werden nicht gelöscht (s. UrsKeepAlive).
Löscht einen noch nicht ausgelösten Alarm.
RequestCode: Eindeutige numerische ID für diesen Alarm.
 
Löscht den angegebenen Channel. Erst ab API Level 26!
Wenn ein neuer Kanal mit derselben ID erstellt wird, wird der gelöschte Kanal mit allen Einstellungen wieder hergestellt, die er vor dem Löschen hatte.
Sortiert eine Liste.
List: Die zu sortierende Liste.
Ascending: Sortierrichtung
Rückgabewert: Die sortierte Liste.
Für die Verwaltung von Alarmen benötigt man ggf. eine nach Zeitpunkten sortierte Liste.
Die einzelnem Elemente werden in Texte gewandelt und dann alphabetisch sortiert.
Ruft den für den Benutzer sichtbaren Namen des Benachrichtigungskanals ab oder legt ihn fest. Erst ab API Level 26!
Die Änderung wirkt sich auch auf bereits angelegte Benachrichtigungskanäle aus.
Ist der Kanal noch nicht angelegt (niemals die Methode Start aufgerufen worden), wird der Kanal angelegt.
Ruft die für den Benutzer sichtbare Beschreibung der Benachrichtigung ab oder legt sie fest. -dito-
Liefert die aktuell auf dem Gerät installierte Android SDK-Version (API-Level). Für den Fall, dass versionspezifische Einstellungen vorgenommen werden müssen.

 

UrsNotification

Die Komponente UrsNotifiaction dient zur Zusammenfassung der verschiedenen Optionen einer Notification. Der Notifiction.Builder wird intern zur Erstellung der Benachrichtigung verwandt.

Wird eine zweite Benachrichtigung mit der gleichen ID (Feld NumberID) erstellt, bevor die vorhergehende gelöscht wurde, wird diese aktualisiert.

Referenz

Designer Bezeichnung Typ Funktion Voreinstellung
AutoCancel boolean Diese Benachrichtigung wird automatisch geschlossen, wenn der Benutzer sie antippt. false
Color Color Die zu verwendende Akzentfarbe. Default
Colorized boolean Die mit Color eingestellte Farbe wird als Hintergrundfarbe für diese Benachrichtigung verwendet. false
IsInsistent boolean Der Ton wird wiederholt, bis die Benachrichtigung geschlossen oder das Benachrichtigungsfenster geöffnet wird. false
IsOngoingEvent boolean Diese Benachrichtigung bezieht sich auf etwas, das gerade ausgeführt wird, z. B. einen Anruf. false
LargeIcon Asset Fügt der Benachrichtigungsinhaltsansicht ein großes Symbol hinzu. -none-
NoClear boolean Die Benachrichtigung sollte nicht abgebrochen werden, wenn der Benutzer auf die Schaltfläche "Alle löschen" klickt. false
NumberID int Eine in der Anwendung eindeutige Kennung für diese Benachrichtigung. 1
OnlyAlertOnce boolean Der Sound, Vibration und Ticker wird nur abgespielt, wenn die Benachrichtigung noch nicht angezeigt wurde. false
SmallIcon String Das kleine Symbol für diese Benachrichtigung in der Statusleiste und in der Inhaltsansicht. Ein System-Symbolname wird erwartet. "ic_launcher"
SmallIconImage Asset Erst ab API Level 23!
Angabe eines Asset-Namens für das kleine Symbol. Diese Angabe hat Vorrang vor SmallIcon. Vorzugsweise eine Grafik mit 96x96 Pixel.
-none-
Title String Die erste fette Textzeile. -none-
Text String Die zweite Textzeile -none-
WhenEnabled boolean Legt fest, ob der Zeitstempel in der Inhaltsansicht angezeigt wird. false
WhenUsesChronometer bboolean Erst ab API Level 16!
Zeigt das Zeitstempelfeld als Stoppuhr an.
false
WhenChronometerCountDown boolean Erst ab API Level 14!
Stellt das Chronometer so ein, dass er herunterzählt anstatt hochzählt.
false

Sämtliche im Designer dargestellten Eigenschaften stehen auch als Getter/Setter-Methoden zur Verfügung. Änderungen wirken sich nicht auf bereits angezeigte oder per Alarm in Auftrag gegebene Nachrichten aus. Ein Update erfolgt über die entsprechenden Create-Methoden mit den passenden IDs.

Methode Funktion Anmerkung
Liefert den aktuell auf dem Gerät vorhandenen API Level. Da nicht alle Funktionalitäten auf allen Geräten zur Verfügung stehen, ist ggf. eine level-abhängige Programmierung notwendig.

UrsIntent

Über ein UrsIntent-Object, dass den Create-Funktionen übergeben wird, wird festgelegt, welche Aktion ausgeführt werden soll, wenn die Benachrichtigung angetippt wird.

Es gibt verschiedene Aktionstypen:

Je nach Aktionstyp werden verschiedene Felder ausgewertet. Beim Typ None ist der Inhalt der Felder naturgemäß gleichgültig. Die Spalte S markiert Felder die für den ActionType Screen relevant sind, die Spalte L die für den ActionType Launcher.

Referenz

Designer Bezeichnung Typ S L Funktion Voreinstellung
ActionType Choice X X Legt den Aktionstyp fest. Mögliche Werte sind None, Screen oder Launcher. Je nach Aktionstyp werden verschiedene Felder ausgewertet (s.u.). None
ActivityAction boolean - X Die auszuführende allgemeine Aktion. false
ActivityClass String - X Der Name einer Klasse innerhalb des Anwendungspakets, die als Komponente für diese Intent verwendet wird.

ActivityPackage und ActivityClass definieren die Activity, die beim Antippen der Benachrichtigung gestartet werden soll.
-none-
ActivityPackage String - X Der Name des Anwendungspakets, mit dem der Intentausgeführt werden soll.

ActivityPackage und ActivityClass definieren die Activity, die beim Antippen der Benachrichtigung gestartet werden soll.
-none-
DataType String - X Der MIME-Typ der Daten, die von diesem Intent verarbeitet werden. -none-
DataUri String - X Der Uri der Daten, auf die dieser Intent abzielt. -none-
FlagClearTask boolean X X Die gestartete Aktivität wird ein neuer Task im Verlaufsstapel. false
FlagClearTop boolean X X Wenn die zu startende Activity bereits in dem aktuellen Task ausgeführt wird, wird keine neue Instanz dieser Activity gestartet. Stattdessen werden alle anderen darüber liegenden Activitys geschlossen und dieser Intent an die alte Aktivität, jetzt an der Spitze des Activity-Stacks, als neuer Intent übergeben. false
FlagExcludeFromRecent boolean X X The new Activity is not kept in the list of recently launched Activitys.
Die neue Activity wird nicht in der Liste der kürzlich gestarteten Activitys gespeichert.
false
FlagNewTask boolean X X Diese Activity wird zum Beginn eines neuen Task in diesem Verlaufsstapel. false
FlagNoAnimation boolean X X Dieses Flag verhindert, dass das System eine Aktivitätsübergangsanimation anwendet, um zum nächsten Aktivitätsstatus zu gelangen. false
FlagNoHistory boolean X X Die neue Aktivität wird nicht im Verlaufsstapel gespeichert. false
ScreenStartValue String X - Der Startwert, der dem zu öffnenden Screen übergeben werden soll. Abrufbar per Control.getStartValue . -none-
ScreenToOpen String X - Der Name des Screens, der beim Antippen der Benachrichtigung geöffnet werden soll. "Screen1"

 

Beispiele

Alle Bespiele sind in dem Download-Archiv enthalten.

  UrsNotificationTest

Eine kleine Beispiel-App zeigt die Verwendung der Extension (s. Download). Sie ermöglicht das Ausprobieren der einzelnen Funktionen.

 
Screenshot Benachrichtigungen

 


  Remember URS

Im diesem Beispiel (s. Download) wird eine App entworfen, die den Benutzer daran erinnert, regelmäßig die App zu öffnen. Die App erstellt einen Alarm, der 30 Sekunden nach Schließen der App eine Benachrichtigung auslöst. Die Wartezeit von nur 30 Sekunden macht das Testen nicht zu langwierig. In der Praxis würde man hier natürlich einen längeren Zeitraum einstellen.

Es gibt leider keine sichere Möglichkeit, das Schließen einer App zu erkennen. Deshalb wird bereits beim Öffnen der App der Alarm angelegt bzw. ein bereits existierender aktualisiert. Die kurze Wartezeit kann dazu führen, dass die Benachrichtigung bereits erstellt wird, wenn die App noch geöffnet ist. Ein Timer mit einem Intervall etwas kürzer als die Wartezeit, aktualisiert laufend den Alarmzeitpunkt.

Wenn der Alarmzeitpunkt eingetroffen ist, wird vom System eine Benachrichtigung erzeugt. Beim Antippen der Benachrichtigung wird die App aufgerufen. Damit beginnt der Kreislauf von vorn.

 
Screenshot Benachrichtigung

Die zugehörigen Blöcke sind recht einfach aufgebaut:

 


  UrsNotoficationAlarm

Dies ist das komplexeste der drei Beispiele (s. Download). Es werden Alarmnachrichten verwaltet.

Ansicht des AI2-Projekts. Screenshot der App Ansicht der Benachrichtigungen

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. Alarmzeitpunkt und ID des Alarms werden in einer Datenbank abgelegt. Nach jeder Betätigung einer Schaltfläche wird überprüft, welche Alarmzeitpunkte abgelaufen sind und diese aus der Datenbank gelöscht. Von den verbleibenden werden jeweils die ersten fünf auf der Oberfläche angezeigt. Damit das Ganze auch ohne Benutzeraktionen funktioniert, findet die Überprüfung zusätzlich über eine Timersteuerung statt.

Zur Anzeige der Alarme werden die notwendigen Container (HorizotalArrangement) sichtbar geschaltet und die enthaltenen Felder gefüllt.

Im Detail:

Erzeugen der Alarmbenachrichtigung

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.

Der 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

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

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 Datenbank hinterlegt und das Label lblAlarmX erhält die formatierten Zeitangabe.

Zuletzt wird das HorizontalArrangement haAlarmX sichtbar geschaltet.

Alarm löschen

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.

Werkzeuge

Für die Erstellung eigener Extensions habe ich einige Tipps zusammengestellt: AI2 FAQ: Extensions entwickeln.