Version | Anpassungen |
---|---|
1.0 (2020-09-07) | Initiale Version |
2.0 (2021-03-08) | Komplett überarbeitete und ergänzte Version |
2.1 (2021-03-16) | Einige Methoden als public deklariert, damit sie von KeepAlive aufgerufen werden können. Dies hat keine Auswirkungen auf die Funktionsweise. |
2.2 (2021-03-20) | Die ID des Intents wurde nicht korrekt an das OnClick-Ereignis weiter geleitet. |
2.3 (2021-04-05) | Die Anzeige der Notification-Eigenschaft NumberID stimmte nicht mit der
internen Vorbelegung überein. Hinweis: Die Beispiele sind nicht betroffen und enthalten noch die Version 2.2 der Extension. |
2.4 (2021-04-16) |
Hinweis: Die Beispiele sind nicht betroffen und enthalten noch die Version 2.2 der Extension. |
2.5 (2021-04-17) | Unter bestimmten Bedingungen wurde das Ereignis UrsNotification.Onclick nur einmal ausgelöst. |
2.6 (2021-05-12) | Das Starten einer AI2-App (Intent-Typ Screen) hat bei Kodular nicht funktioniert, wenn der Package Name geändert wurde. |
2.7 (2021-05-15) | Das Starten einer AI2-App (Intent-Typ Screen) hat bei Kodular nicht
funktioniert, wenn der Package Name geändert wurde. GetActiveNotifications hinzugefügt |
2.8 (2021-06-13) | Eigenschaft FlagNewTask wurde beim Intent nicht korrekt ausgewertet, wird
für Android 10 aber benötigt. Voreinstellung für Eigenschaft FlagNewTask ist nun true. |
2.9.1 (2022-10-13) | Angepasst für SDK31 (Android 12): Alle PendingIntent erhalten das Flag FLAG_IMMUTABLE. android.permission.SCHEDULE_EXACT_ALARM requested. Globale Exception wird gefangen und ins Log ausgegeben. |
2.10 (2023-11-23) | Angepasst für SDK33 (Android 13): Um Notifications auszugeben, ist die Permission POST_NOTIFICATIONS notwendig Methode AreNotificationsEnabled hinzugefügt Methode OpenNotificationSettings hinzugefügt Methode AreNotificationsPaused hinzugefügt |
2.11 (2024-09-04) | Angepasst für Android 14 |
2.12 (2024-10-26) | Bug bei der Benutzung mehrerer Intent-Instanzen beseitigt. |
2.13 (2024-11-03) | - Ereignis OnNewIntent hizugefügt - Eigenschaft IsRunningInCompanion hinzugefügt - PropertyCategories bei Designer-Properties geändert, damit die Extension unter Kodular funktioniert - Interne Neustrukturierung einiger Code-Bereiche |
Hinweis: Die Darstellung der Benachrichtigung ist stark abhängig von der Implementierung durch den Gerätehersteller.
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.
Das ZIP-Archiv UrsAI2Notifier zum Download. Das Archiv enthält den Quellcode, das kompilierte Binary zum Upload in den App Inventor und einige Beispiel-Anwendungen.
Es ist nicht sicher gestellt, dass in allen Beispielen die jeweils aktuellsten Versionen der Extensions verwendet werden. Beim Ausprobieren der Beispiele sollte man daher ggf. die neuesten Version nachladen.
Eine Übersicht zu den Benachrichtigungen findet man in der Android Dokumentation: Übersicht zu Benachrichtigungen.
Benachrichtigungen werden in einem separatem Fenster (Notification Panel), unabhängig von der App angezeigt. Sie können erzeugt und gelöscht werden. Es gibt keine besonderen Funktionen zu deren Abänderungen. Benachrichtigungen besitzen eine eindeutige ID (NumberID). Wird eine zweite Benachrichtigung mit der gleichen ID erstellt, bevor die vorhergehende gelöscht wurde, wird bestehende aktualisiert.
Android besitzt keine Methode, um aktive Benachrichtigungen zu ermitteln. Programme müssen bei Bedarf selbst nachhalten, welche Benachrichtigungen sie erzeugt haben.
Benachrichtigungen, die mit dieser Extension erzeugt werden können, haben den folgenden Aufbau (es müssen nicht immer alle Elemente angezeigt werden):
Sämtliche Text-Elemente können mit HTML-Tags formatiert werden. Welche HTML-Tags benutzt werden können, variiert je nach Implementierung des Android-Systems. Hinweise gibt es bei Mark Murphy's Technical Stuff oder Daniel Lew's Coding Thoughts.
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 ab API Level 26 einem solchen Kanal zugeordnet werden. Bis einschließlich API Level 25 sind alle den Benachrichtigungskanal betreffende Angaben und Funktionen wirkungslos.
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 (Importance) oder das Vibrationsmuster, werden auf der Kanal-Ebene festgelegt. Diese Eigenschaften werden von der App bei der Anlage des Kanals festgelegt. Der Benutzer hat mit Hilfe die App Eigenschaften vollen Zugriff auf die meisten der Kanalattribute und kann sie nach belieben modifizieren. Die Modifikationen des Benutzers sollen nicht überschrieben werden. Deshalb können die Kanaleigenschaften nachträglich nicht mehr per Programm geändert werden. Das geht sogar soweit, dass, wenn eine Kanal gelöscht und anschließend wieder angelegt wird, 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.
Man sollte sich also sehr gut überlegen, welche Eigenschaften einem Kanal zugewiesen werden.
Will man andere Eigenschaften ändern, muss ein neuer Kanal (neue Channel-ID) verwendet werden. Den bestehenden Kanal versteckt man sinnvollerweise beim Start der App mit UrsAI2NotificationChannel.HideChannel.
Man sollte sich also sehr gut überlegen, welche Eigenschaften einem Kanal zugewiesen werden.
Android benutzt Intent-Objekte, um dem System Aufträge zu erteilen. Ein Intent enthält alle Angaben, die notwendig sind, den Auftrag auszuführen. Der AI2 ActivityStarter z.B. benutzt intern Intents um andere Apps zu starten.
Alarme sind Aktionen, die zu einer bestimmten Zeit (Alarmzeitpunkt) ausgelöst werden. Sie sind mit einem Intent verknüpft, der angibt, welche Aktion zum Alarmzeitpunkt auszuführen ist.
Ein Alarm kann erzeugt und gelöscht werden. Es gibt keine besonderen Funktionen zu dessen Abänderungen. Ein Alarm besitzen eine eindeutige ID (RequestCode). Wird ein zweiter Alarm mit der gleichen ID erstellt, bevor der vorhergehende ausgelöst wurde, wird der bestehende aktualisiert.
Android besitzt keine Methode, um aktive Alarme zu ermitteln. Programme müssen bei Bedarf selbst nachhalten, welche Alarme sie erzeugt haben.
Android verwaltet die nacheinander gestarteten Activities in einem Stapel. Im App Inventor ist eine Activity entweder ein Screen oder eine andere App, die z.B. über die ActivityStarter-Komponente aufgerufen wird.
Die Top Activity ist der Screen, der gerade auf dem Bildschirm des Android-Geräts angezeigt wird. Die Base Acticity ist der Screen mit dem die App gestartet wurde, also Screen1.
Jedes Mal, wenn eine neuer Screen über die Anweisung Contol.open another screen oder Contol.open another screen with start value aufgerufen wird, wird eine neue Activity erzeugt und wird zur neuen Top Activity. Wenn der Benutzer die Back-Taste drückt (daher der Name BackStack) oder eine der Anweisungen Contol.close screen, Contol.close screen with plain text oder Contol.close screen with value ausgeführt wird, wird die oberste Activity vom Stapel genommen und zerstört. Die darunter die darunter liegende Activity wird zur neuen Top Activity und auf dem Bildschirm angezeigt.
Normalerweise sind die Activities im Stapel unabhängig voneinander. Eine Activity weiß nicht, ob und welche Activities über oder unter ihr im Stapel liegen. Sie erfährt auch i.d.R. nicht, dass eine andere Activity geschlossen wurde. Sie erfährt lediglich über Ereignisse, ob sie gerade angezeigt wird und ob Eingaben gemacht werden können (siehe Activity Lifecycle).
Dies ist beim App Inventor anders. Dort gibt es das Ereignis Screen.OtherScreenClosed über das ein Screen erfährt, dass der vorher geöffnete Screen geschlossen wurde. Das funktioniert so:
Man kann eine neue Activity starten, um von dieser eine Dienstleistung zu erhalten, also z.B. ein Kamera-Bild aufzunehmen. Android stellt dafür die Funktion startActivityForResult bereit. Das Ergebnis, das die gestartete Activity zurück liefert, wird vom Betriebssystem über die Callback-Funktion onActivityResult mitgeteilt. Der Aufruf dieser Funktion ist gleichzeitig der Hinweis darauf, die die neu gestartete Activity beendet wurde. App Inventor nutzt immer diese Funktion, um einen neuen Screen zu erzeugen, und die Callback-Funktion, um das Ereignis Screen.OtherScreenClosed auszulösen. Intern hält App Inventor in einer Variable den Namen des Screens fest, der zuletzt aufgerufen wurde. Dessen Name wird dann ebenfalls im Ereignis als Argument bereit gestellt.
Das klappt hervorragend, solange man sich nicht in die Verwaltung des BackStacks einmischt. Dies ist aber möglich und üblich, wenn man Notifications benutzt. Android wird beim Erstellen der Notification in Form eines Intents mitgeteilt (siehe Über Vorhaben (Intent)), was geschehen soll, wenn die Benachrichtigung selbst oder eine der Aktionsschaltflächen angeklickt wird. Häufig soll eine neue Activity gestartet werden oder eine bereits vorhandene in Vordergrund gebracht werden. Dabei z.B. muss, wenn sich die Activity in der Stapelmitte befindet, festgelegt werden, was mit Rest des Stapels geschehen soll. Man kann sich leicht vorstellen, dass dann der startActivityForResult-onActivityResult -Mechanismus durcheinander gebracht wird. Konkret bedeutet das, dass das Ereignis Screen.OtherScreenClosed nicht, nicht mehr zuverlässig oder mit falschen Werten ausgelöst wird. Man muss sich also sehr genaue Gedanken für das Zusammenspiel der App mit der Notification machen.
Wenn die Notification dazu genutzt wird, einen Screen der App zu öffnen oder in den Vordergrund zu bringen, wird in dem Screen das Ereignis Screen.Initialize, wenn der Screen neu erzeugt wird. Die Felder der Screen erhalten die voreingestellten Werte. Ist der Screen bereits geöffnet und wird lediglich in Vordergrund gebracht. Wird statt dessen das Ereignis UrsNotification.OnNewIntent ausgelöst.
Was genau geschehen soll, wird durch die Flags des Intents ( Intent.Flags und folgende) festgelegt. Ich kann leider nicht im Detail erklären, wie die Flags gesetzt werden müssen, um ein bestimmtes Verhalten auszulösen. Die Dokumentation zum Intent ist recht kurz und ausführlichere Erklärungen sind weit verstreut. Das muss jeder selbst lesen und ausprobieren. Valera hat die nachfolgende Tabelle erstellt, die die Wirkung der Flags sehr gut beschreibt.
Flag | Beschreibung | Verwendung |
---|---|---|
FLAG_CLEAR_TASK | Löscht den aktuellen Task, indem alle Aktivitäten im Stapel entfernt werden, wenn eine Aktivität in einen neuen Task gestartet wird. Siehe FLAG_NEW_TASK | Wird verwendet, um einen neuen Aufgabenstapel zu erstellen, wenn der aktuelle Bildschirm vollständig ersetzt werden soll. |
FLAG_CLEAR_TOP | Entfernt alle Aktivitäten über der angegebenen, wenn sie bereits im Stapel vorhanden ist, und macht sie zur obersten. | Nützlich, wenn zu einem bestimmten Bildschirm zurückgekehrt werden soll, während alle Zwischenbildschirme aus dem Stapel entfernt werden sollen. |
FLAG_EXCLUDE_FROM_RECENTS | Schließt die Aktivität von der Liste der zuletzt verwendeten Anwendungen aus. | Wird für vorübergehende oder vertrauliche Bildschirme verwendet, die nicht in der Liste der zuletzt verwendeten angezeigt werden sollen. |
FLAG_NEW_TASK | Startet die Aktivität in einem neuen Aufgabenstapel. | Nützlich, wenn die Aktivität unabhängig vom aktuellen Aufgabenfluss existieren soll. |
FLAG_NO_ANIMATION | Deaktiviert die Animation beim Wechsel zu einer Aktivität oder beim Verlassen. | Wird verwendet, wenn ein sofortiger Übergang ohne Animation erforderlich ist, z. B. bei Bestätigungsbildschirmen. |
FLAG_NO_HISTORY | Die Aktivität wird nicht im Aufgabenstapel gespeichert und sofort nach dem Verlassen zerstört. | Anwendbar auf vorübergehende Bildschirme wie Anmeldefenster, die nicht im Verlauf gespeichert werden müssen. |
FLAG_PREVIOUS_IS_TOP | *Wird nicht mehr unterstützt.* Wurde verwendet, um die vorherige Aktivität beim Schließen der aktuellen an die Spitze des Stapels zurückzubringen. | *Wurde in früheren Android-Versionen zur Verwaltung des Aufgabenstapels verwendet.* |
FLAG_REORDER_TO_FRONT | Verschiebt eine bereits vorhandene Aktivität an die Spitze des Stapels, ohne eine neue Instanz zu erstellen. | Praktisch für die Rückkehr zu einem bereits geöffneten Bildschirm. Dabei bleibt dessen Zustand erhalten. |
FLAG_RESET_TASK_IF_NEEDED | Wenn die Aufgabe in den Vordergrund verschoben wird, wird die Aktivität neu gestartet, wenn dies zur korrekten Wiederherstellung des Stapels erforderlich ist. | Wird vom System zur Verwaltung von Aufgaben bei Übergängen zwischen Anwendungen verwendet. |
FLAG_SINGLE_TOP | Verhindert die Erstellung eines neuen Exemplars der Aktivität, wenn sie bereits an der Spitze des Stapels ist. | Nützlich, um das Duplizieren eines Bildschirms zu vermeiden, wenn dieser bereits aktiv ist, z. B. bei einem Benachrichtigungsbildschirm. |
FLAG_TASK_ON_HOME | Fixiert die Aufgabe als 'Startbildschirm' – verschiebt sie in die Position des Hauptaufgabenstapels. | Wird verwendet, damit ein separater Aufgabenfluss sich wie der Hauptbildschirm der Anwendung verhält, wenn die Home-Taste gedrückt wird. |
Die App Inventor Extension UrsAi2Notification ermöglicht es, Android Benachrichtigungen zu erstellen. Die Extension enthält drei verschiedene Komponenten:
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 (Android) 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 (Referenz) stellt folgende Funktionen zur Erzeugung von einfachen Benachrichtigungen bereit:
Im Download ist das Beispielprojekt SimpleNotificationTest enthalten, dass die Anwendung dieser drei Funktionen zeigt.
Im Download ist das Beispielprojekt
ExtendedNotificationTest enthalten, dass die Anwendung
dieser Funktion zeigt.
Im Download ist das Beispielprojekt ProgressBarTest enthalten, dass die Anwendung dieser Funktion zeigt.
Im Download ist das Beispielprojekt Notification Alarm Test enthalten, dass die Anwendung dieser Funktion zeigt. Ein zweites Beispiel ist Remember URS.
Benachrichtigungen muss man auch wieder löschen können:
Die Methode HideChannel 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.).
Weitere Hilfreiche Funktionen sind
1) Die Funktion benötigt die Permission EXPAND_STATUS_BAR. Diese Permission ist im Standard-AI2-Companion nicht angefordert und funktioniert dort nicht. In Kapitel AI2-FAQ: Patchen des AI2 Companion - zusätzliche Permissions wird erklärt, wie man den AI2-Companion patchen kann und um die notwendigen Permission zu erhalten.
Die Komponente UrsNotifiaction (Referenz) dient zur Zusammenfassung der verschiedenen Optionen einer Notification. Der Notifiction.Builder wird intern zur Erstellung der Benachrichtigung verwandt. Benachrichtigungen können abgeändert werden. Wird eine zweite Benachrichtigung mit der gleichen ID (Feld NumberID) erstellt, bevor die vorhergehende gelöscht wurde, wird diese aktualisiert.
Die Funktionen Create und Cancel sind i.W. identisch mit denen des Benachrichtigungskanals. Sie erzeugen eine Benachrichtigung mit den Einstellungen der Komponente bzw. löschen die Benachrichtigung mit der in der Komponente definierten ID (NumberID).
Die Funktionen SetProgress, SetProgressEx, RemoveProgressBar, RemoveProgressBarEx modifizieren eine mit der Funktion UrsAI2NotificationChannel.CreateProgressNotification erstellte Fortschrittsbenachrichtigung.
AddActionButton und RemoveActionButtons dienen zum Hinzufügen und Entfernen von Aktionsschaltflächen. Es können bis zu drei Aktionsschaltflächen angezeigt werden.
Anstatt eine andere Activity zu starten, kann man in dem Screen, zu dem das UrsNotification-Objekt gehört, das Ereignis OnClick auslösen. Dazu muss eine UrsIntent mit dem ActionType Event angegeben werden.
Das Auslösen des Ereignisses OnClick funktioniert nicht, wenn der zugehörige Screen geschlossen wurde. Apps, die diese Funktion nutzen, müssen sicher stellen, dass die Benachrichtigung entweder geschlossen (Eigenschaft CancelOnDestroy) oder passend abgeändert wird. Leider erlaubt es der App Inventor nicht, das Activity.onDestroy-Ereignis an die App weiter zu geben. Diese hat also keine Möglichkeit, die Benachrichtigung entsprechend abzuändern. Deshalb wird über die Funktion SetOnDestroyAction eine passende Benachrichtigung registriert, die angezeigt wird, wenn die App geschlossen wird. Zu beachten ist, dass die intern notwendig Objekte zum Zeitpunkt des Aufrufs dieser Funktion erstellt werden1). Wenn nachträglich Änderungen am übergebenen UrsNotificationObject oder UrsIntentObject vorgenommen werden sollen, muss die Funktion SetOnDestroyAction erneut aufgerufen werden. Ansonsten hätte die Änderung keine Wirkung.
1) Wenn die App aus der App-Übersicht (Historie) geschlossen wird, steht nur begrenzte Zeit und ein begrenzter Funktionsumfang zur Verfügung (Test mit Version Android Oreo, 8.1). Dieser reicht nicht aus, um die Objekte zum Zeitpunkt des Schließen zu erstellen.
RemoveOnDestroyAction entfernt den Auftrag, eine neue Benachrichtigung beim Schließen des Screens anzuzeigen.
AreNotificationsEnabled und AreNotificationsPaused liefern Informationen zum Status des Notification-Systems.
Über ein UrsIntent-Objekt (Referenz), dass den Create...-Funktionen übergeben wird, wird festgelegt, welche Aktion ausgeführt werden soll, wenn die Benachrichtigung angetippt wird.
Diese Komponente ist eine Sammlung von Eigenschaften. Sie besitzt weder Funktionen noch Ereignisse.
Der Aktionstyp (ActionType) bestimmt, welche Aktion mit dem Intent ausgelöst wird:
Über die Eigenschaft ID können die Intents beim OnClick-Ereignis unterschieden werden. Wenn man also bei einer Benachrichtigung mit Aktionsschaltflächen das OnClick-Ereignis nutzen will, muss für die eigentliche Benachrichtigung und für jede Aktionsschaltfläche eine andere UrsIntent-Instanz übergegeben werden, die sich mindestens in der ID unterscheiden. Die ID der zugehörigen UrsIntent-Instanz wird dem OnClick-Ereignis übergeben.
Fehler werden über das Ereignis Screen.ErrorOccurred gemeldet. Wenn kein Handler für dieses Ereignis implementiert ist, wird vom System eine Fehlermeldung angezeigt. Dazu wird die Funktion Notifiert.ShowAlert benutzt. Durch die Implementierung von Screen.ErrorOccurred wird die Anzeige der Fehlermeldung verhindert und es kann programmtechnisch auf den Fehler reagiert werden.
Code | Fehlertext | Bedeutung | Auslöser |
---|---|---|---|
17001 | Invalid value at UrsChannelObject. | Falscher Typ beim Parameter UrsChannelObject. | UrsNotification.Create, UrsNotification.SetOnDestroyAction |
17002 | Invalid Vibration Pattern | Ungültiges Vibrationsmuster. | UrsAI2NotificationChannel (beim Start der App) |
17003 | Invalid sound file name | Die angegebene Audiodatei existiert nicht. | UrsAI2NotificationChannel (beim Start der App) |
17004 | Screen not found: <screen name> | Der angegebene Screen existiert nicht. | UrsAI2NotificationChannel.CreateAiNotification |
17005 | Invalid value at UrsNotificationObject. | Falscher Typ beim Parameter UrsNotificationObject. | UrsAI2NotificationChannel: CreateNotification, CreateAlarm, CreateAlarmEx, CreateAlarmAt, CreateProgressNotification UrsNotification.SetOnDestroyAction |
17006 | Invalid value at UrsIntentObject | Falscher Typ beim Parameter UrsIntentObject. | UrsAI2NotificationChannel: CreateActionNotification, CreateNotification, CreateAlarm, CreateAlarmEx, UrsAI2NotificationChannel.CreateAlarmAt, CreateProgressNotification UrsNotification: AddActionButton, Create, SetOnDestroyAction |
17007 | Invalid Delay value | Delay ist kleiner als 1. | UrsAI2NotificationChannel: CreateAlarm, CreateAlarmEx |
17008 | Invalid Millis value | Die Angabe ist kleiner als die aktuelle Zeit. | UrsAI2NotificationChannel.CreateAlarmAt |
17009 | Notification not created yet | Die Benachrichtigung wurde noch nicht erstellt. | UrsNotification: SetProgress, SetProgressEx, RemoveProgressBar, RemoveProgressBarEx |
17010 | Must specify Title | Die Angabe zum Parameter Title fehlt. | UrsNotification.AddActionButton |
Beachte: Wenn du ein Beispiel ausprobierst, stelle sicher, dass dieses die neueste Version der Extension enthält. Ich habe es schon mehrfach vergessen, eines der Beispiele beim Update zu aktualisieren.
Simple Notification TestDieses Bespiel zeigt, wie die UrsNotificationChannel.Create...-Methoden funktionieren. |
|
Extended Notification TestEs werden die erweiterten Möglichkeiten, wie Symbole, Bilder und Aktionsschaltflächen gezeigt. |
|
Progress Bar TestDas Thema ist Anzeige von Fortschrittsbenachrichtigungen. |
|
Notification Alarm TestBenachrichtigungen werden verzögert oder zu bestimmten Zeitpunkten ausgelöst. |
|
Remember URSEine praktische Anwendung, die den Benutzer daran erinnert, die App regelmäßig zu starten. |
|
KeepAwake_NotificationDie Gestaltung einer Benachrichtigung im Zusammenhang mit einem ForegroundService, der für das Setzen eines WakeLocks notwendig ist. |