Advertisement
  1. Code
  2. Android SDK

Erste Schritte mit Push-Benachrichtigungen auf Android 

Scroll to top
Read Time: 11 min

German (Deutsch) translation by Władysław Łucyszyn (you can also view the original English article)

Einführung

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, wodurch die Wahrscheinlichkeit erhöht wird, 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. 

Warum Google Cloud Messaging verwenden?

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 zwischen dem Server und dem Client erreicht, die auf unbegrenzte Zeit offen 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, der häufig als CCS bezeichnet wird, die dauerhaften Verbindungen für Sie.  Außerdem wird sichergestellt, dass Ihre Push-Benachrichtigungen sicher und zuverlässig übermittelt werden.

Voraussetzungen

Um mit mir zu folgen, brauchst du: 

1. Einrichten des Android Studio-Projekts 

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 MainActivity.java enthalten. 

Schritt 1: Fügen Sie die Abhängigkeiten hinzu 

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 den Abhängigkeitsbereich des build.gradle des Projekts einfügen: 

1
classpath 'com.google.gms:google-services:1.5.0'

Wenden Sie anschließend das Plugin in build.gradle des App-Moduls an:

1
apply plugin: 'com.google.gms.google-services'

Um die GCM-API verwenden zu können, fügen Sie com.google.android.gms: play-services  als Kompilierungsabhängigkeit in derselben Datei hinzu: 

1
compile "com.google.android.gms:play-services:8.3.0"

Wenn Sie auf die Schaltfläche Jetzt synchronisieren klicken, sollte der folgende Fehler angezeigt werden: 

Install Repository and sync projectInstall Repository and sync projectInstall Repository and sync project

Repository installieren und Projekt synchronisieren Klicken Sie auf den Link Repository installieren und synchronisieren, um den Fehler zu beheben.

 Schritt 2: Aktualisieren Sie das Manifest 

Erstellen und verwenden Sie in der Datei AndroidManifest.xml des Projekts eine benutzerdefinierte C2D_MESSAGE-Berechtigung, die auf dem Paketnamen des Projekts basiert.  Stellen Sie sicher, dass die ProtectionLevel der Berechtigung auf Signatur gesetzt ist. 

1
<permission
2
    android:name="com.github.hathibelagal.pn.permission.C2D_MESSAGE"
3
    android:protectionLevel="signature" />
4
<uses-permission
5
  android:name="com.github.hathibelagal.pn.permission.C2D_MESSAGE" />

Die Benachrichtigungen werden in Form von Sendungen empfangen.  Für diese Broadcasts benötigt unsere App einen BroadcastReceiver.  Wir müssen es jedoch nicht manuell erstellen.  Wir können stattdessen die GcmReceiver-Klasse als BroadcastReceiver verwenden. 

Der BroadcastReceiver muss über einen Intent-Filter verfügen, der auf die Aktion com.google.android.c2dm.intent.RECEIVE reagiert, und der Name der Kategorie muss mit dem Paketnamen des Projekts übereinstimmen.  Fügen Sie dem Manifest den folgenden Code hinzu:

1
<receiver
2
    android:name="com.google.android.gms.gcm.GcmReceiver"
3
    android:exported="true"
4
    android:permission="com.google.android.c2dm.permission.SEND" >
5
    <intent-filter>
6
        <action android:name="com.google.android.c2dm.intent.RECEIVE" />
7
        <category android:name="com.github.hathibelagal.pn" />
8
    </intent-filter>
9
</receiver>

2. Rufen Sie einen Server-API-Schlüssel und eine Absender-ID ab 

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.

Welcome screenWelcome screenWelcome screen

Klicken Sie anschließend unten auf die Schaltfläche Dienste auswählen und konfigurieren.  Sie können jetzt die Google-Dienste auswählen, die Sie der App hinzufügen möchten.  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.

Project detailsProject detailsProject details

Klicken Sie anschließend unten auf die Schaltfläche Dienste auswählen und konfigurieren.  Sie können jetzt die Google-Dienste auswählen, die Sie der App hinzufügen möchten.

Available Google ServicesAvailable Google ServicesAvailable Google Services

Klicken Sie zunächst auf die Schaltfläche Cloud Messaging und anschließend auf Google Cloud Messaging aktivieren.  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.

Server API key and sender IDServer API key and sender IDServer API key and sender ID

Das zuvor hinzugefügte Google Services-Plugin benötigt eine Konfigurationsdatei, um ordnungsgemäß zu funktionieren.  Generieren Sie die Datei, indem Sie auf die Schaltfläche Konfigurationsdateien generieren klicken. 

Laden Sie die erstellte Datei herunter und speichern Sie sie im App-Verzeichnis Ihres Android Studio-Projekts.

3. Den Client registrieren 

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. 

Schritt 1: Erstellen Sie einen Registrierungsdienst 

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, ist ein IntentService ideal für diese Aufgabe.

Erstellen Sie eine neue Java-Klasse mit dem Namen RegistrationService.java, machen Sie diese zu einer Unterklasse von IntentService und überschreiben Sie die onHandleIntent-Methode. 

1
public class RegistrationService extends IntentService {
2
    public RegistrationService() {
3
        super("RegistrationService");
4
    }
5
6
    @Override
7
    protected void onHandleIntent(Intent intent) {
8
9
    }
10
}

Innerhalb der onHandleIntent-Methode können wir die Instanz-ID-API verwenden, um das Registrierungstoken zu generieren oder abzurufen. Erstellen Sie zunächst eine Instanz der InstanceID-Klasse mit ihrer getInstance-Methode. 

1
InstanceID myID = InstanceID.getInstance(this);

Wir können jetzt die getToken-Methode des InstanceID-Objekts verwenden, um das Registrierungstoken in Form eines Strings abzurufen.  getToken erwartet die Absender-ID als eines seiner Argumente.  Da wir unserem Projekt die Datei google-services.json hinzugefügt haben, können wir die Absender-ID mithilfe von R.string.gcm_defaultSenderID an die Methode übergeben. 

1
String registrationToken = myID.getToken(
2
        getString(R.string.gcm_defaultSenderId),
3
        GoogleCloudMessaging.INSTANCE_ID_SCOPE,
4
        null
5
);

Wenn Sie den Inhalt des Registrierungstokens zu Debug-Zwecken anzeigen möchten, können Sie es mit der Methode Log.d als Debug-Nachricht protokollieren. 

1
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 werde Ihnen jetzt zeigen, wie Sie ein Thema mit dem Namen my_little_topic abonnieren. Es dauert nur zwei Zeilen Code.  Erstellen Sie zunächst eine neue Instanz der GcmPubSub-Klasse mit ihrer getInstance-Methode.  Rufen Sie als Nächstes seine Abonnementmethode auf und übergeben Sie das Registrierungstoken zusammen mit dem Namen des Themas.

1
GcmPubSub subscription = GcmPubSub.getInstance(this);
2
subscription.subscribe(registrationToken, "/topics/my_little_topic", null);

Unsere App kann jetzt jede Push-Benachrichtigung erhalten, die an my_little_topic veröffentlicht wurde.

Definieren Sie schließlich den Dienst in AndroidManifest.xml

1
<service android:name=".RegistrationService"
2
   android:exported="false" />

Der Registrierungsservice ist abgeschlossen.

Schritt 2: Erstellen Sie einen InstanceIDListenerService 

Registrierungstoken werden regelmäßig aktualisiert.  Folglich muss jede Android-App, die GCM verwendet, über einen InstanceIDListenerService verfügen, der diese Aktualisierungen verarbeiten kann.  Erstellen Sie daher eine neue Java-Datei mit dem Namen TokenRefreshListenerService.java und machen Sie sie zu einer Unterklasse von InstanceIDListenerService. In der onTokenRefresh-Methode der Klasse müssen wir lediglich den Registrierungsvorgang erneut starten, indem der Registrierungsdienst mit einer Intent-Methode und der startService-Methode gestartet wird.

Fügen Sie den folgenden Code hinzu TokenRefreshListenerService.java:

1
public class TokenRefreshListenerService extends InstanceIDListenerService {
2
    @Override
3
    public void onTokenRefresh() {
4
        Intent i = new Intent(this, RegistrationService.class);
5
        startService(i);
6
    }
7
}

Dieser Dienst muss auf die Aktion com.google.android.gms.iid.InstanceID reagieren können. Fügen Sie beim Definieren des Dienstes in AndroidManifest.xml daher den entsprechenden Intent-Filter hinzu. 

1
<service
2
    android:name=".TokenRefreshListenerService"
3
    android:exported="false">
4
    <intent-filter>
5
        <action android:name="com.google.android.gms.iid.InstanceID" />
6
    </intent-filter>
7
</service>

Schritt 3: Starten des Registrierungsdienstes

Um sicherzustellen, dass der Registrierungsprozess beginnt, sobald die App gestartet wird, müssen Sie die RegistrationService-Klasse in der OnCreate-Methode von MainActivity starten.  Erstellen Sie dazu einen Intent und verwenden Sie die Methode startService

1
Intent i = new Intent(this, RegistrationService.class);
2
startService(i);

4. Anzeigen von Push-Benachrichtigungen 

GCM zeigt Push-Benachrichtigungen automatisch im Benachrichtigungsbereich an, sobald sie empfangen werden.  Dies geschieht jedoch nur, wenn die zugehörige App einen GCMListenerService enthält. 

Erstellen Sie eine neue Java-Klasse namens NotificationsListenerService und machen Sie sie zu einer Unterklasse von GCMListenerService.  Wenn Sie die übertragenen Daten nicht selbst behandeln möchten, müssen Sie keinen Code innerhalb dieser Klasse schreiben.  Wir können diese Klasse vorerst leer lassen. 

1
public class NotificationsListenerService extends GcmListenerService {
2
3
}

Stellen Sie beim Definieren des Dienstes in AndroidManifest.xml sicher, dass Sie einen Intent-Filter hinzufügen, mit dem er auf die Aktion com.google.android.c2dm.intent.RECEIVE reagieren kann. 

1
<service
2
    android:name=".NotificationsListenerService"
3
    android:exported="false" >
4
    <intent-filter>
5
        <action android:name="com.google.android.c2dm.intent.RECEIVE" />
6
    </intent-filter>
7
</service>

5. Hinzufügen von Push-Benachrichtigungssymbolen

Jeder Push-Benachrichtigung muss ein Symbol zugeordnet sein.  Wenn Sie kein Handy zur Hand haben, können Sie es von der Material Design Icons Library von Google erhalten. 

Material design icons libraryMaterial design icons libraryMaterial design icons library

Wenn Sie das Symbol heruntergeladen haben, platzieren Sie es im Ordner res Ihres Projektes.  Ich werde ic_cloud_white_48dp als Symbol verwenden. 

6. Android-App ausführen

Unsere Android-App ist jetzt abgeschlossen.  Nachdem Sie es kompiliert und auf einem Android-Gerät ausgeführt haben, können Sie das Registrierungstoken in den Logcat-Protokollen sehen.

Registration token in logcatRegistration token in logcatRegistration token in logcat

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 in NotificationsListenerService mithilfe der Notification.Builder-Klasse erstellen. 

7. Senden von Push-Benachrichtigungen

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. 

Schritt 1: Skript erstellen

Erstellen Sie eine neue Datei namens send.py und öffnen Sie sie mit Ihrem bevorzugten Texteditor. 

Importieren Sie am Anfang der Datei die Module urllib2 und urllib.  Wir verwenden diese Module, um Daten an den Cloud Connection Server von Google zu senden.  Importieren Sie auch das Json-Modul, da die von uns gesendeten Daten gültige JSON-Werte sein müssen.  Um zuletzt auf Befehlszeilenargumente zuzugreifen, importieren Sie das sys-Modul. 

1
from urllib2 import *
2
import urllib
3
import json
4
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. 

1
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.

1
messageTitle = sys.argv[1]
2
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 Thema namens my_little_topic veröffentlicht werden.  Fügen Sie daher einen Schlüssel für das Wörterbuch hinzu, und setzen Sie seinen Wert auf / topics / my_little_topic

Um den Inhalt der Benachrichtigung darzustellen, fügen Sie einen Schlüssel namens Benachrichtigung zum Wörterbuch hinzu und setzen Sie seinen Wert auf ein anderes Wörterbuchobjekt, das drei Schlüssel enthält: 

  • Karosserie
  • Titel 
  • Symbol 

Stellen Sie sicher, dass der Wert des Symbolschlüssels mit dem Namen des in Ihrem Android-Projekt gezeichneten Symbols übereinstimmt.

1
data={
2
    "to" : "/topics/my_little_topic",
3
    "notification" : {
4
        "body" : messageBody,
5
        "title" : messageTitle,
6
        "icon" : "ic_cloud_white_48dp"
7
    }
8
}

Konvertieren Sie das Wörterbuch mithilfe der Dump-Funktion des Json-Moduls in einen JSON-String: 

1
dataAsJSON = json.dumps(data)

Jetzt müssen Sie nur noch den JSON-String an https://gcm-http.googleapis.com/gcm/send senden.  Erstellen Sie dazu ein neues Request-Objekt und setzen Sie dataAsJSON als seine Daten.  Setzen Sie als nächstes den Authorization-Header auf MY_API_KEY und den Content-Type-Header auf application / json

1
request = Request(
2
    "https://gcm-http.googleapis.com/gcm/send",
3
    dataAsJSON,
4
    { "Authorization" : "key="+MY_API_KEY,
5
      "Content-type" : "application/json"
6
    }
7
)

Um die Anforderung auszuführen und die Antwort abzurufen, übergeben Sie das Anforderungsobjekt schließlich an die Funktion urlopen und rufen seine Lesemethode auf. 

1
print urlopen(request).read()

Das Python-Skript ist jetzt fertig und kann verwendet werden.

Schritt 2: Ausführen des Skripts 

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 send.py erstellt haben. 

Übergeben Sie den Namen des Skripts an die ausführbare Python-Datei zusammen mit einer Zeichenfolge für den Titel der Benachrichtigung und einer für den Nachrichtentext.  Hier ist ein Beispiel, das Sie verwenden können: 

1
python send.py "My first push notification" "GCM API is wonderful!"

Wenn keine Fehler vorliegen, erhalten Sie eine Antwort, die wie folgt aussieht:

1
{"message_id":12345676892321}

Wenn Sie Ihr Android-Gerät überprüfen, sollte eine neue Benachrichtigung in der Benachrichtigungsleiste angezeigt werden. 

Push notification in notification trayPush notification in notification trayPush notification in notification tray

Fazit 

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 ihnen zu oft die schnellste Möglichkeit ist, Ihre App zu erhalten deinstalliert. 

Weitere Informationen zu Google Cloud Messaging finden Sie im Cloud Messaging-Handbuch.

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.