Android-Benachrichtigungen: Wiederholung, Badges und Gamification
Benachrichtigungen in einem Aufgabenmanager sind entscheidend. Wenn die Erinnerung nicht zur richtigen Zeit ankommt, hat die App versagt. Und auf Android ist es ein ständiger Kampf gegen das Betriebssystem selbst, eine Erinnerung zur richtigen Zeit zu liefern.
Das ist kein Code-Problem. Es ist ein Ökosystem-Problem. Samsung, Xiaomi, Huawei, Oppo: Jeder Hersteller implementiert seine eigene Batteriesparrichtlinie, die deine App und ihre geplanten Benachrichtigungen ohne Vorwarnung beenden kann. Füge noch Icon-Badges, FCM-Push-Nachrichten und Gamification-Benachrichtigungen hinzu, und du erhältst ein System, das gleichzeitig zuverlässig, herstellerübergreifend und emotional befriedigend sein muss.
Kernpunkte
- Wiederkehrende Erinnerungen planen die nächsten 30 Vorkommen auf einmal, um das Beenden durch Android zu überleben, anstatt nur das nächste Vorkommen zu planen.
- Jedes Öffnen der App überprüft und plant verlorene Benachrichtigungen, die beim Neustart oder durch das System beendet wurden, neu.
- Icon-Badges auf Android erfordern spezifische Implementierungen pro Launcher (Samsung, Nova, AOSP), ohne eine einheitliche API.
- Gamification-Benachrichtigungen verwandeln einen Systemmechanismus in einen Motivationsmoment durch personalisierte Nachrichten und benutzerdefinierte Icons.
Warum 30 Vorkommen statt nur eines planen?
Die Antwort ist ein Wort: Überleben. Auf Android kann das Betriebssystem jederzeit entscheiden, deine App zu beenden, um Speicher freizugeben. Wenn die App beendet wird, stirbt die JavaScript-Logik, die das nächste Vorkommen planen sollte, mit ihr.
Die naive Strategie ist, nur die nächste Erinnerung zu planen und die nächste zu planen, wenn die erste ausgelöst wird. Problem: Wenn die App zwischen dem Auslösen der Erinnerung und der Neuplanung beendet wird, ist die Kette unterbrochen. Der Benutzer erhält nie wieder eine Erinnerung.
Meine Lösung: Plane die nächsten 30 Vorkommen sofort bei der Erstellung der wiederkehrenden Erinnerung. Wenn du eine tägliche Erinnerung um 9 Uhr hast, erstellt die App sofort 30 Alarme: einen für morgen um 9 Uhr, einen für übermorgen um 9 Uhr und so weiter. Selbst wenn die App 3 Wochen lang beendet wird, kommen die Erinnerungen weiterhin an.
Die Android-Dokumentation zu AlarmManager empfiehlt die Verwendung von setExactAndAllowWhileIdle für kritische Alarme. Das ist es, was ich für jedes Vorkommen verwende. Das "AllowWhileIdle" ist entscheidend: Ohne dies kann der Doze-Modus von Android (aktiviert, wenn das Telefon unbewegt und nicht angeschlossen ist) den Alarm auf unbestimmte Zeit verschieben.
Warum 30 und nicht 365? Weil zu viele gleichzeitige Alarme die Leistung und den Akku beeinträchtigen können. 30 Tage sind der ideale Kompromiss: Der Benutzer ist für einen Monat abgedeckt, und die App aktualisiert die Vorkommen bei jedem Öffnen. Ich hatte diese Art von Leistungs-/Zuverlässigkeitskompromiss bereits in dem Artikel über die Wiederholung von Erinnerungen untersucht.
Wie werden verlorene Benachrichtigungen beim Neustart gehandhabt?
Wenn ein Telefon neu startet, gehen alle über AlarmManager geplanten Alarme verloren. Dies ist das Standardverhalten von Android. Die offizielle Lösung: den Broadcast BOOT_COMPLETED abhören, um die Alarme beim Start neu zu planen.
Theoretisch ist das sauber. In der Praxis ist es ein Minenfeld.
Samsung blockiert BOOT_COMPLETED standardmäßig auf einigen Modellen mit ihrer "Batterieoptimierung". Xiaomi hat MIUI, das den automatischen Start von Apps verhindert, es sei denn, der Benutzer erlaubt dies manuell in den Einstellungen. Huawei mit EMUI macht dasselbe. Oppo mit ColorOS, ebenfalls. Laut der Website Don't Kill My App, die die Verhaltensweisen der Hersteller auflistet, blockieren einige Geräte bis zu 90% der Broadcasts.
Meine pragmatische Lösung: sich nicht nur auf BOOT_COMPLETED verlassen. Bei jedem Öffnen der App führt der NotificationService ein vollständiges Audit durch:
- Abrufen der aktiven Erinnerungen aus der lokalen Datenbank.
- Überprüfung: Existiert für jede Erinnerung der entsprechende Alarm noch im
AlarmManager? - Neuplanung fehlender Alarme.
- Bereinigung veralteter Alarme (gelöschte Aufgaben, deaktivierte Erinnerungen).
Dieser Prozess dauert etwa 200 ms für 50 aktive Erinnerungen. Der Benutzer bemerkt es nicht. Aber es garantiert, dass selbst wenn das Telefon neu gestartet wurde, selbst wenn der Hersteller den Boot-Broadcast blockiert hat, die Benachrichtigungen beim nächsten Öffnen der App neu geplant werden.
Wie handhabt Firebase Cloud Messaging Gruppen-Push-Nachrichten?
Lokale Benachrichtigungen (Erinnerungen, Wiederholungen) werden vom AlarmManager auf dem Gerät verwaltet. Push-Benachrichtigungen (Gruppenaktivität, freigeschaltete Badges, Erwähnungen) laufen über Firebase Cloud Messaging.
Der Ablauf ist wie folgt:
- Ein Benutzer erstellt eine Aufgabe in einer Gruppe und weist sie einem Mitglied zu.
- Das Backend erkennt die Zuweisung und ruft das FCM-Token des Zugewiesenen aus der Datenbank ab.
- Das Backend sendet eine FCM-Nachricht mit Titel, Text und einer Daten-Payload (Aktionstyp, Aufgaben-ID, Gruppen-ID).
- Das Telefon des Zugewiesenen empfängt den Push, auch wenn die App geschlossen ist.
- Wenn der Benutzer auf die Benachrichtigung tippt, öffnet sich die App dank des Deep Links in der Payload direkt bei der betreffenden Aufgabe.
Die Hauptfalle bei FCM: Tokens ändern sich. Ein FCM-Token kann ungültig werden, wenn der Benutzer die App deinstalliert und neu installiert, wenn er die App-Daten löscht oder wenn Google beschließt, es zu recyceln. Meine Strategie: Das Token bei jedem Start der App aktualisieren und mit dem in der DB gespeicherten vergleichen. Wenn es anders ist, aktualisieren. Und auf der Backend-Seite löst jeder FCM-Sende-Fehler mit dem Code messaging/registration-token-not-registered eine automatische Bereinigung des ungültigen Tokens aus.
Das ist das gleiche Resilienzprinzip, das ich im Sicherheits- und Rate-Limiting-System anwende: Fehler antizipieren, nicht nur verwalten, wenn sie auftreten.
Warum sind Icon-Badges auf Android so schwierig?
Der kleine rote Kreis mit einer Zahl auf dem App-Icon. Auf iOS ist das eine Codezeile: UIApplication.shared.applicationIconBadgeNumber = 5. Das ist eine standardisierte System-API seit iOS 3.
Auf Android gibt es keine standardisierte API für Icon-Badges. Jeder Launcher implementiert seine eigene Methode:
- Samsung (OneUI): Verwendet den Samsung BadgeProvider über einen spezifischen ContentProvider.
- Nova Launcher: Liest Badges aus einem benutzerdefinierten Broadcast Intent.
- AOSP/Pixel: Verwendet den Benachrichtigungskanal mit
setNumber()auf der Benachrichtigung selbst (kein eigenständiges Badge). - Xiaomi (MIUI): Hat seine eigene API über einen anderen ContentProvider als Samsung.
- Huawei: Verwendet die Huawei Mobile Services anstelle der Google Play Services.
Die Bibliothek react-native-app-badge abstrahiert einen Teil dieser Fragmentierung, deckt aber nicht alle Fälle ab. Ich habe diese Realität akzeptiert: Auf einigen Geräten funktionieren die Badges perfekt. Auf anderen werden sie nicht angezeigt. Die App sollte sich niemals ausschließlich auf Badges verlassen, um wichtige Informationen zu kommunizieren; sie sind ein visueller Bonus, kein kritischer Kanal.
Wie verändern Gamification-Benachrichtigungen das Erlebnis?
Die befriedigendsten Benachrichtigungen sind nicht die Erinnerungen. Es sind die Gamification-Benachrichtigungen. Ein freigeschaltetes Badge, ein erreichter Streak-Meilenstein, ein Level-Up: Das sind Momente des Feierns, die der Benutzer nicht erwartet hat.
Ich habe drei Arten von Gamification-Benachrichtigungen implementiert:
Badge freigeschaltet
Lokale Benachrichtigung mit einem benutzerdefinierten Icon, das dem Badge entspricht. Der Text ist personalisiert: "Badge Pro-Organisator freigeschaltet! Du hast 100 Aufgaben erstellt." Das ist ansprechender als "Neues Badge freigeschaltet". Die Personalisierung der Nachricht erhöht die Beibehaltungsrate der Benachrichtigung laut den Forschungen von OneSignal zur Personalisierung.
Streak-Meilenstein
"30-Tage-Streak! Mach weiter so." Der Streak ist ein Zähler für aufeinanderfolgende Nutzungstage der App. Das System erkennt Meilensteine: 7 Tage, 30 Tage, 100 Tage, 365 Tage. Jeder Meilenstein löst eine Benachrichtigung und Bonuspunkte aus. Ich hatte das gesamte Gamification-System in dem Artikel über das Gamification-Schema detailliert beschrieben.
Level-Up
"Level 5 erreicht! Du bist jetzt Stratege." Die 12 Level haben jeweils einen Namen und einen Punktschwellenwert. Die Level-Up-Benachrichtigung ist die seltenste und lohnendste. Es ist der gleiche Mechanismus variabler Belohnung, den B.F. Skinner in seinen Forschungen zur Verstärkung beschrieben hat: unvorhersehbare Belohnungen erzeugen ein stärkeres Engagement als vorhersehbare Belohnungen.
Die Gemeinsamkeit dieser drei Typen: Sie verwandeln eine Benachrichtigung (ein oft als aufdringlich empfundener Mechanismus) in einen positiven Moment. Der Benutzer erleidet die Benachrichtigung nicht, er erwartet sie. Das ist genau die Philosophie des Gamification-Feeds: Engagement sichtbar und lohnend machen.
Wie optimiert man die Zuverlässigkeit von Benachrichtigungen auf allen Geräten?
Wenn ich es in einem Satz zusammenfassen müsste: Vertraue nichts. Vertraue nicht BOOT_COMPLETED. Vertraue nicht AlarmManager im Doze-Modus. Vertraue nicht FCM-Tokens. Vertraue nicht Icon-Badges.
Die Strategie der Tiefenverteidigung:
- Schicht 1: Lokale Alarme über
setExactAndAllowWhileIdle(30 vorab geplante Vorkommen). - Schicht 2: Audit und Neuplanung bei jedem Öffnen der App.
- Schicht 3: FCM-Push als Backup für kritische Erinnerungen (vom Backend gesendet, wenn der lokale Alarm nicht bestätigt wurde).
- Schicht 4: Benutzerführung zu den Batterie-Einstellungen des Herstellers (dedizierter Bildschirm in den App-Einstellungen).
Dieser letzte Punkt wird oft vernachlässigt. Die App enthält einen Bildschirm, der den Hersteller des Telefons erkennt und den Benutzer Schritt für Schritt anleitet, die Batterieoptimierung für TAMSIV zu deaktivieren. Das ist technische UX: dem Benutzer erklären, warum seine Erinnerungen möglicherweise nicht funktionieren und wie er Abhilfe schaffen kann. Das ist die gleiche Transparenz wie beim Onboarding mit Lazy Registration: ehrlich über Einschränkungen sein, anstatt sie zu verbergen.
Häufig gestellte Fragen
Funktionieren wiederkehrende Erinnerungen, wenn das Telefon ausgeschaltet ist?
Nein. Kein Alarm kann ausgelöst werden, wenn das Telefon ausgeschaltet ist. Sobald das Telefon jedoch neu startet, plant die App die verpassten Vorkommen beim nächsten Öffnen automatisch neu. Vergangene Erinnerungen werden nicht rückwirkend gesendet.
Warum sind Benachrichtigungen auf einigen Telefonen manchmal verspätet?
Das hängt mit dem Doze-Modus von Android und den Batterieoptimierungen der Hersteller zusammen. TAMSIV verwendet setExactAndAllowWhileIdle, um Verzögerungen zu minimieren, aber einige Hersteller (insbesondere Xiaomi und Huawei) legen zusätzliche Einschränkungen fest. Der Abschnitt "Benachrichtigungen" in den App-Einstellungen erklärt, wie man diese deaktiviert.
Können Gamification-Benachrichtigungen deaktiviert werden?
Ja. Die App-Einstellungen ermöglichen es, die Benachrichtigungen für Badges, Streaks und Level-Ups unabhängig voneinander zu deaktivieren. Aufgaben-Erinnerungen und Gruppen-Push-Nachrichten befinden sich auf separaten Kanälen und sind davon nicht betroffen.
Geht der Streak verloren, wenn ich einen Tag verpasse?
Der Streak wird auf Null zurückgesetzt, wenn du einen Tag verpasst. Das "Streak Freeze"-System ermöglicht es dir jedoch, deinen Streak zu schützen: Wenn du genügend Punkte gesammelt hast, kannst du einen Freeze aktivieren, der deinen Streak für einen Tag Inaktivität bewahrt.
Zeigen die Icon-Badges die genaue Anzahl ungelesener Benachrichtigungen an?
Auf Samsung und kompatiblen Launchern ja, das Badge zeigt die genaue Anzahl an. Auf Standard-AOSP-Launchern ist das Badge ein einfacher Punkt (Anwesenheit/Abwesenheit) ohne Zahl. Das ist eine Android-Einschränkung, die Google noch nicht vereinheitlicht hat.