Die Installation der App durch die Benutzer ist nur die halbe Miete. Sie regelmäßig zu benutzen, ist die andere Hälfte. Es ist durchaus möglich, dass Ihre Benutzer Ihre App vollständig vergessen, nachdem Sie sie ein- oder zweimal verwendet haben. Was ist mit all den anderen neuen Apps, die um ihre Aufmerksamkeit kämpfen?.
Durch die Verwendung von Push-Benachrichtigungen können Sie die Benutzer gelegentlich an Ihre App erinnern und so die Wahrscheinlichkeit erhöhen, dass Ihre App auf ihren Geräten installiert bleibt.
Google Cloud Messaging, kurz GCM, ist ein kostenloser Service, mit dem Sie Push-Benachrichtigungen an Ihre Nutzer senden können. In diesem Lernprogramm erfahren Sie, wie Sie damit eine Android-App erstellen, die Push-Benachrichtigungen erhalten kann, und ein einfaches serverseitiges Python-Skript, das sie generieren und senden kann.
Für die meisten Client-Server-Kommunikationen initiiert der Client Anforderungen, um Daten vom Server zu empfangen. Der Client holt also Daten vom Server. Bei Push-Benachrichtigungen ist es jedoch der Server, der die Datenübertragung initiiert.
Dies wird normalerweise durch die Aufrechterhaltung einer permanenten TCP / IP-Verbindung erreicht, eine Verbindung, die auf unbegrenzte Zeit zwischen Server und Client geöffnet bleibt. Das mag großartig klingen, aber wenn Sie eine beliebte App haben, kann das Aufrechterhalten Tausender dauerhafter Verbindungen zwischen Ihrem Server und den Geräten Ihrer Benutzer sehr teuer sein.
Google Cloud Messaging ist ein Dienst, der dieses Problem löst, indem er als Vermittler zwischen Ihrem Server und dem Gerät Ihres Nutzers fungiert. Mit GCM verwaltet der Cloud Connection Server von Google, häufig als CCS bezeichnet, die permanenten Verbindungen für Sie. Außerdem wird sichergestellt, dass Ihre Push-Benachrichtigungen sicher und zuverlässig übermittelt werden.
Um mit mir zu folgen, brauchst du:
Starten Sie Android Studio und erstellen Sie ein neues Projekt mit einer leeren Aktivität
. Wenn Sie die Standardwerte verwendet haben, sollte das Projekt eine Java-Klasse in enthalten MainActivity.java.
In diesem Projekt verwenden wir das Google Services Gradle Plugin zur Konfiguration von GCM. Fügen Sie es in das Projekt ein, indem Sie die folgende Zeile in das Feld einfügen Abhängigkeiten
Abschnitt des Projekts build.gradle:
groovy classpath 'com.google.gms: google-services: 1.5.0'
Als nächstes wenden Sie das Plugin an App
Modul build.gradle:
Groovy Apply Plugin: 'com.google.gms.google-services'
Um die GCM-API verwenden zu können, fügen Sie hinzu com.google.android.gms: play-services
Als ein kompilieren
Abhängigkeit in derselben Datei:
groovy kompilieren "com.google.android.gms: play-services: 8.3.0"
Wenn Sie auf klicken Jetzt synchronisieren Schaltfläche sollte der folgende Fehler angezeigt werden:
Drücke den Repository installieren und Projekt synchronisieren Link, um den Fehler zu beheben.
Innerhalb des Projekts AndroidManifest.xml Datei, erstellen und verwenden Sie einen benutzerdefinierten C2D_MESSAGE Berechtigung basierend auf dem Paketnamen Ihres Projekts. Stellen Sie sicher, dass die Schutzlevel
der Erlaubnis ist auf gesetzt Unterschrift.
"xml
"
Die Benachrichtigungen werden in Form von Sendungen empfangen. Um mit diesen Sendungen umgehen zu können, benötigt unsere App eine Rundfunkempfänger
. Es muss jedoch nicht manuell erstellt werden. Wir können stattdessen die verwenden GcmReceiver
Klasse als die Rundfunkempfänger
.
Das Rundfunkempfänger
muss ein haben Vorsatzfilter
das antwortet auf die com.google.android.c2dm.intent.RECEIVE
Aktion und der Name seiner Kategorie
muss mit dem Paketnamen Ihres Projekts übereinstimmen. Fügen Sie dem Manifest den folgenden Code hinzu:
"xml
"
Bei der Kommunikation mit dem Cloud Connection Server müssen wir uns anhand eines API-Schlüssels auf der Serverseite und einer Absenderkennung auf der Clientseite identifizieren. Um den API-Schlüssel und die Absender-ID zu erhalten, erstellen Sie ein neues Projekt in der Entwicklerkonsole.
Beginnen Sie mit einem Klick auf Wähle eine Plattform Taste. Klicken Sie anschließend auf Dienste für meine Android-App aktivieren Taste. Wenn Sie dies tun, werden Sie aufgefordert, einen Namen und einen Android-Paketnamen für Ihre App anzugeben. Stellen Sie sicher, dass der von Ihnen angegebene Android-Paketname mit dem Paketnamen übereinstimmt, den Sie beim Erstellen des Android Studio-Projekts eingegeben haben.
Klicken Sie anschließend auf Dienste auswählen und konfigurieren Knopf am unteren Rand. Sie können jetzt die Google-Dienste auswählen, die Sie der App hinzufügen möchten.
Klicken Sie zunächst auf die Schaltfläche Cloud Messaging und dann klicken Aktivieren Sie Google Cloud Messaging. Nach wenigen Sekunden erhalten Sie den Server-API-Schlüssel und die Absender-ID. Notieren Sie sich den Server-API-Schlüssel, und drücken Sie Schließen.
Das zuvor hinzugefügte Google Services-Plugin benötigt eine Konfigurationsdatei, um ordnungsgemäß zu funktionieren. Generieren Sie die Datei, indem Sie auf klicken Konfigurationsdateien generieren Taste.
Laden Sie die erstellte Datei herunter und platzieren Sie sie in Ihrem Android Studio-Projekt App Verzeichnis.
GCM identifiziert Android-Geräte mithilfe von Registrierungstoken. Daher muss sich unsere App von jedem Android-Gerät, auf dem sie installiert ist, registrieren können.
Die Registrierung muss in einem Hintergrund-Thread erfolgen, da der Vorgang je nach Netzwerkverbindung eine Weile dauern kann. Da für die Registrierung keine Eingaben vom Benutzer erforderlich sind, können Sie IntentService
ist ideal für diese aufgabe.
Erstellen Sie eine neue Java-Klasse mit dem Namen RegistrationService.java, mache es eine Unterklasse von IntentService
, und überschreiben seine onHandleIntent
Methode.
"java public class RegistrationService erweitert IntentService public RegistrationService () super (" RegistrationService ");
@Override protected void onHandleIntent (Absichtsabsicht) "
In der onHandleIntent
Methode können wir die Instanz-ID-API verwenden, um das Registrierungstoken zu generieren oder abzurufen. Erstellen Sie zuerst eine Instanz von InstanceID
Klasse, mit seiner bekomme Instanz
Methode.
java InstanceID myID = InstanceID.getInstance (this);
Wir können jetzt die verwenden bekomme Token
Methode der InstanceID
Objekt, um das Registrierungs-Token in Form eines String
. bekomme Token
erwartet die Absender-ID als eines seiner Argumente. Weil wir das hinzugefügt haben google-services.json Datei an unser Projekt übergeben, können wir die Sender-ID mit der Methode an die Methode übergeben R.string.gcm_defaultSenderID
.
java String registrationToken = myID.getToken (getString (R.string.gcm_defaultSenderId), GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);
Wenn Sie den Inhalt des Registrierungstokens zu Debug-Zwecken anzeigen möchten, können Sie es als Debug-Nachricht mit dem Protokollieren von protokollieren Log.d
Methode.
java Log.d ("Registration Token", RegistrationToken);
An diesem Punkt können Sie das Registrierungstoken an Ihren Webserver senden und dort in einer Datenbank speichern. Sie müssen dies jedoch nicht tun, wenn Sie Ihre Benutzer nicht individuell ansprechen möchten. Wenn Sie beabsichtigen, die gleiche Nachricht an jeden Benutzer zu senden, sollten Sie dem Publish-Subscribe-Ansatz folgen.
Ich zeige Ihnen jetzt, wie Sie einen abonnieren können Thema
namens my_little_topic. Es dauert nur zwei Zeilen Code. Erstellen Sie zuerst eine neue Instanz von GcmPubSub
Klasse mit seiner bekomme Instanz
Methode. Als nächstes rufen Sie es an abonnieren
Methode und übergeben Sie das Registrierungstoken zusammen mit dem Namen des Themas.
java GcmPubSub-Abonnement = GcmPubSub.getInstance (this); subscription.subscribe (registrationToken, "/ topics / my_little_topic", null);
Unsere App kann jetzt jede Push-Benachrichtigung erhalten, die auf veröffentlicht wurde my_little_topic.
Definieren Sie schließlich den Dienst in AndroidManifest.xml.
"xml
"
Der Registrierungsservice ist abgeschlossen.
InstanceIDListenerService
Registrierungstoken werden regelmäßig aktualisiert. Folglich muss jede Android-App, die GCM verwendet, über eine InstanceIDListenerService
das kann mit diesen Aktualisierungen umgehen. Erstellen Sie daher eine neue Java-Datei mit dem Namen TokenRefreshListenerService.java und mache es eine Unterklasse von InstanceIDListenerService
. In der onTokenRefresh
Als Methode der Klasse müssen Sie lediglich den Registrierungsvorgang erneut starten, indem Sie den Registrierungsdienst mit einem starten Absicht
und das Dienst starten
Methode.
Fügen Sie den folgenden Code hinzu TokenRefreshListenerService.java:
java public class TokenRefreshListenerService erweitert InstanceIDListenerService @Override public void onTokenRefresh () Intent i = new Intent (this, RegistrationService.class); startService (i);
Dieser Dienst muss in der Lage sein, auf die zu reagieren com.google.android.gms.iid.InstanceID
Aktion. Deshalb bei der Definition des Dienstes in AndroidManifest.xml, fügen Sie das entsprechende hinzu Vorsatzfilter
.
"xml
"
Um sicherzustellen, dass der Registrierungsprozess beginnt, sobald die App gestartet wird, müssen Sie die RegistrationService
Klasse in der onCreate
Methode von Hauptaktivität
. Erstellen Sie dazu eine Absicht
dafür und benutze die Dienst starten
Methode.
java Intent i = new Intent (dies ist RegistrationService.class); startService (i);
GCM zeigt Push-Benachrichtigungen automatisch im Benachrichtigungsbereich an, sobald sie empfangen werden. Dies geschieht jedoch nur, wenn die zugehörige App eine enthält GCMListenerService
.
Erstellen Sie eine neue Java-Klasse mit dem Namen NotificationsListenerService und mache es eine Unterklasse von GCMListenerService
. Wenn Sie die übertragenen Daten nicht selbst behandeln möchten, müssen Sie keinen Code in diese Klasse schreiben. Wir können diese Klasse vorerst leer lassen.
"Die Java-Klasse NotificationsListenerService erweitert GcmListenerService
"
Während der Definition des Dienstes in AndroidManifest.xml, Stellen Sie sicher, dass Sie eine hinzufügen Vorsatzfilter
das erlaubt es auf das zu reagieren com.google.android.c2dm.intent.RECEIVE
Aktion.
"xml
"
Jeder Push-Benachrichtigung muss ein Symbol zugeordnet sein. Wenn Sie nicht über ein Handy verfügen, können Sie es von der Material Design Icons Library von Google erhalten.
Wenn Sie das Symbol heruntergeladen haben, platzieren Sie es in der res Ordner Ihres Projekts. Ich werde verwenden ic_cloud_white_48dp als das Symbol.
Unsere Android-App ist jetzt abgeschlossen. Nachdem Sie es kompiliert und auf einem Android-Gerät ausgeführt haben, können Sie das Registrierungstoken im sehen Logcat Protokolle.
Drücken Sie die Zurück-Taste an Ihrem Gerät, um die App zu beenden. Dies ist erforderlich, da GCM Push-Benachrichtigungen nur dann automatisch anzeigt, wenn der Benutzer die App nicht verwendet. Wenn Sie möchten, dass die Benachrichtigungen auch angezeigt werden, während die App ausgeführt wird, müssen Sie die Benachrichtigungen selbst erstellen NotificationsListenerService
Verwendung der Benachrichtigung.Builder
Klasse.
Im letzten Teil dieses Lernprogramms erstellen wir ein einfaches Python-Skript, mit dem Push-Benachrichtigungen generiert und an alle Android-Geräte gesendet werden können, auf denen unsere App installiert ist.
Sie können dieses Skript auf Ihrem lokalen Computer oder auf einem Remote-Webserver ausführen, auf den Sie SSH-Zugriff haben.
Erstellen Sie eine neue Datei mit dem Namen send.py und öffnen Sie es mit Ihrem bevorzugten Texteditor.
Importieren Sie am oberen Rand der Datei die urllib2
und Urllib
Module. Wir werden diese Module verwenden, um Daten an den Cloud Connection Server von Google zu senden. Importieren Sie die Json
Modul auch, weil die Daten, die wir senden, gültige JSON sein müssen. Um schließlich auf Befehlszeilenargumente zuzugreifen, importieren Sie die sys
Modul.
python von urllib2 import * import urllib import json import sys
Als Nächstes erstellen Sie eine Variable, die den Server-API-Schlüssel speichert, den Sie zuvor notiert haben. Der Schlüssel muss Teil jeder HTTP-Anforderung sein, die wir an das CCS senden.
python MY_API_KEY = "ABCDEF123456789ABCDE - 12A"
Jede Benachrichtigung muss einen Titel und eine Nachricht haben. Anstatt sie in unserem Skript fest zu codieren, akzeptieren wir Titel und Text als Befehlszeilenargumente mit dem argv
Array.
python messageTitle = sys.argv [1] messageBody = sys.argv [2]
Erstellen Sie ein neues Python-Wörterbuchobjekt, um die Daten darzustellen, die an das CCS gesendet werden sollen. Damit unsere Android-App die Benachrichtigung erhalten kann, muss sie zu einem bestimmten Thema veröffentlicht werden my_little_topic. Fügen Sie daher einen Schlüssel namens hinzu zu zu dem Wörterbuch und setzen Sie seinen Wert auf / topics / my_little_topic.
Um den Inhalt der Benachrichtigung darzustellen, fügen Sie einen aufgerufenen Schlüssel hinzu Benachrichtigung zu dem Wörterbuch und legen Sie seinen Wert auf ein anderes Wörterbuchobjekt fest, das drei Schlüssel enthält:
Stellen Sie sicher, dass der Wert von Symbol
Schlüssel entspricht dem Namen des Symbols, das in Ihrem Android-Projekt gezeichnet werden kann.
python data = "bis": "/ topics / mein_kleines_ziel", "Benachrichtigung": "body": messageBody, "title": messageTitle, "icon": "ic_cloud_white_48dp"
Konvertieren Sie das Wörterbuch mit der Zeichenfolge in eine JSON-Zeichenfolge Dumps
Funktion des Json
Modul:
python dataAsJSON = json.dumps (Daten)
Jetzt müssen Sie nur noch den JSON-String an https://gcm-http.googleapis.com/gcm/send senden. Erstellen Sie dazu ein neues Anfordern
Objekt und Satz dataAsJSON
als seine Daten. Als nächstes stellen Sie die Genehmigung
Header zu MY_API_KEY
und das Inhaltstyp
Header zu Anwendung / Json.
python request = Request ("https://gcm-http.googleapis.com/gcm/send"), dataAsJSON, "Authorization": "key =" + MY_API_KEY, "Inhaltstyp": "application / json")
Um die Anforderung auszuführen und die Antwort abzurufen, übergeben Sie das Anforderungsobjekt schließlich an urlopen
Funktion und nennen es lesen
Methode.
python print urlopen (request) .read ()
Das Python-Skript ist jetzt fertig und kann verwendet werden.
Jetzt können wir Push-Benachrichtigungen an alle Geräte senden, auf denen unsere App installiert ist. Öffnen Sie ein Terminal und geben Sie das Verzeichnis ein, in dem Sie erstellt haben send.py.
Übergeben Sie den Namen des Skripts an die Python
zusammen mit einer Zeichenfolge für den Titel der Benachrichtigung und einer für den Nachrichtentext ausführbar. Hier ist ein Beispiel, das Sie verwenden können:
bash python send.py "Meine erste Pushbenachrichtigung" "GCM-API ist wunderbar!"
Wenn keine Fehler vorliegen, erhalten Sie eine Antwort, die wie folgt aussieht:
Javascript "message_id": 12345676892321
Wenn Sie Ihr Android-Gerät überprüfen, sollte eine neue Benachrichtigung in der Benachrichtigungsleiste angezeigt werden.
Sie wissen jetzt, wie Sie Push-Benachrichtigungen an Ihre Benutzer senden. In dieser Lektion haben Sie gelernt, wie Sie eine Android-App erstellen, die sich selbst registrieren kann und Benachrichtigungen erhält, die zu einem bestimmten Thema veröffentlicht werden. Sie haben auch gelernt, wie Sie ein Python-Skript erstellen, das Benachrichtigungen veröffentlichen kann.
Obwohl sich Push-Benachrichtigungen als eine großartige Möglichkeit für die Kommunikation mit Ihren Benutzern anfühlen, empfehle ich, sie nur sparsam zu verwenden, und nur dann, wenn Sie etwas Nützliches zu sagen haben, da das Senden zu vieler von Benutzern zu oft die schnellste Möglichkeit ist, Ihre App zu erhalten deinstalliert.
Weitere Informationen zu Google Cloud Messaging finden Sie im Cloud Messaging-Handbuch.