So richten Sie mehrere Broadcast-Empfänger für die Verarbeitung von Push-Benachrichtigungen auf Android ein

Veröffentlicht: 2024-11-23

Broadcast-Empfänger sind die Handler für den Empfang und die Verarbeitung von Push-Benachrichtigungen, die an ein Android-Gerät gesendet werden. Das Einrichten eines einzelnen Broadcast-Empfängers für die Verarbeitung von Push-Benachrichtigungen an Ihre App ist ein unkomplizierter Vorgang.

Was aber, wenn Sie Push-Benachrichtigungen aus unterschiedlichen Quellen verarbeiten müssen? zum Beispiel von mehreren Push-Benachrichtigungs-Drittanbietern und/oder von Ihren eigenen Servern?

Es gibt zwei Möglichkeiten, dies zu tun.

A. Initialisieren mehrerer Broadcast-Empfänger in Ihrer AndroidManifest.xml

Wenn Sie zwei oder mehr Broadcast-Empfänger in der AndroidManifest.xml-Datei Ihrer App initialisieren, werden die onReceive-Methoden jeder dieser Empfänger aufgerufen, wenn Ihre App eine Push-Benachrichtigung empfängt. Unten habe ich XML-Code für die Einrichtung eines Rundfunkempfängers für CleverTap und eines Rundfunkempfängers für meine eigene App LocalBot.

<receiver android:name="com.example.LocalBot.MyBroadcastReceiver" android:permission="com.google.android.c2dm.permission.SEND"> <intent-filter> <action android:name="com.google.android.c2dm.intent.RECEIVE"/> <action android:name="com.google.android.c2dm.intent.REGISTRATION"/> <category android:name="com.example.LocalBot"/> </intent-filter> </receiver> <receiver android:name="com.clevertap.android.sdk.GcmBroadcastReceiver" android:permission="com.google.android.c2dm.permission.SEND"> <intent-filter> <action android:name="com.google.android.c2dm.intent.RECEIVE"/> <action android:name="com.google.android.c2dm.intent.REGISTRATION"/> <category android:name="com.example.LocalBot"/> </intent-filter> </receiver>
<receiver android:name="com.example.LocalBot.MyBroadcastReceiver" android:permission="com.google.android.c2dm.permission.SEND"> <intent-filter> <action android:name="com.google.android.c2dm.intent.RECEIVE"/> <action android:name="com.google.android.c2dm.intent.REGISTRATION"/> <category android:name="com.example.LocalBot"/> </intent-filter> </receiver> <receiver android:name="com.clevertap.android.sdk.GcmBroadcastReceiver" android:permission="com.google.android.c2dm.permission.SEND"> <intent-filter> <action android:name="com.google.android.c2dm.intent.RECEIVE"/> <action android:name="com.google.android.c2dm.intent.REGISTRATION"/> <category android:name="com.example.LocalBot"/> </intent-filter> </receiver>

Beachten Sie, dass zwar beide Empfänger bei einer eingehenden Nachricht aufgerufen werden, eine doppelte Behandlung jedoch höchst unwahrscheinlich ist, da Drittanbieter Nutzlasten ignorieren, die ihre eindeutigen Kennungen nicht enthalten. Wenn Sie Ihre eigenen Nutzlasten senden, achten Sie darauf, eine eigene eindeutige Kennung anzugeben.

Dies ist die einfachste Lösung, aber etwas ineffizient, da bei jeder eingehenden Benachrichtigung beide Empfänger aufgerufen werden.

Schauen wir uns nun die zweite, effizientere Strategie an.
B. Ein gemeinsamer Rundfunkempfänger zum Weiterleiten von Pushs an die relevanten Rundfunkempfänger.

Bei diesem schrittweise effizienteren Ansatz registrieren Sie nur Ihren eigenen benutzerdefinierten Rundfunkempfänger. Anschließend leiten Sie die eingehende Push-Benachrichtigung über Ihren eigenen Rundfunkempfänger entweder an einen bestimmten Rundfunkempfänger oder an alle anderen Rundfunkempfänger weiter. Sie können den Anwendungsfall für einen der oben genannten Ansätze nach eigenem Ermessen entscheiden.

Im Fall von Clevertap wissen wir, dass die JSON-Payload von ihnen den Schlüssel „nm“ enthält. Dies kann verwendet werden, um eine Clevertap-Push-Benachrichtigung zu identifizieren und die Benachrichtigung an den jeweiligen Broadcast-Handler von Clevertap weiterzuleiten. Ebenso könnten Sie im Fall von Parse, Appboy oder Localytics deren API-Dokumentation durchgehen, um herauszufinden, wie ihre Push-JSON-Nutzlast eindeutig identifiziert werden kann.
Im Folgenden werde ich einen kleinen Codeabschnitt durchgehen, in dem ich meinen eigenen Broadcast-Handler habe, MyBroadcastReceiver.java. Dies ist der Broadcast-Handler, den alle Push-Benachrichtigungen durchlaufen. Ich führe eine Bedingungsprüfung durch, um zu sehen, ob ein Push von Clevertap kam, und wenn ja, übergebe ich ihn an den Broadcast-Handler von Clevertap. Ansonsten übergebe ich es an meinen eigenen Push-JSON-Payload-Handler. Für diese Diskussion gehe ich davon aus, dass ich nur Push-Benachrichtigungen von Clevertap und meinen eigenen Servern erwarte.
Zuerst habe ich meinen Broadcast-Handler wie folgt in meine AndroidManifest.xml-Datei eingefügt: –

<receiver android:name="com.example.LocalBot.MyBroadcastReceiver" android:permission="com.google.android.c2dm.permission.SEND"> <intent-filter> <action android:name="com.google.android.c2dm.intent.RECEIVE"/> <action android:name="com.google.android.c2dm.intent.REGISTRATION"/> <category android:name="com.example.LocalBot"/> </intent-filter> </receiver>
<receiver android:name="com.example.LocalBot.MyBroadcastReceiver" android:permission="com.google.android.c2dm.permission.SEND"> <intent-filter> <action android:name="com.google.android.c2dm.intent.RECEIVE"/> <action android:name="com.google.android.c2dm.intent.REGISTRATION"/> <category android:name="com.example.LocalBot"/> </intent-filter> </receiver>

Dann habe ich die MyBroadcastReceiver-Klasse wie folgt erstellt:-

package com.example.LocalBot; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.support.v4.content.WakefulBroadcastReceiver; import android.util.Log; import com.clevertap.android.sdk.CleverTapAPI; import com.clevertap.android.sdk.GcmBroadcastReceiver; import com.google.android.gms.gcm.GoogleCloudMessaging; public class MyBroadcastReceiver extends WakefulBroadcastReceiver { public void onReceive(Context context, Intent intent) { Bundle extras = intent.getExtras(); GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(context); String messageType = gcm.getMessageType(intent); if (GoogleCloudMessaging.MESSAGE_TYPE_MESSAGE.equals(messageType)) { String ctpn = extras.getString(CleverTapAPI.NOTIFICATION_TAG); if(ctpn!=null && ctpn.equals("true")) { GcmBroadcastReceiver obj = new GcmBroadcastReceiver(); obj.onReceive(context, intent); } } else { MyHandler obj = new MyHandler(); obj.handlePush(intent); } } }
package com.example.LocalBot; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.support.v4.content.WakefulBroadcastReceiver; import android.util.Log; import com.clevertap.android.sdk.CleverTapAPI; import com.clevertap.android.sdk.GcmBroadcastReceiver; import com.google.android.gms.gcm.GoogleCloudMessaging; public class MyBroadcastReceiver extends WakefulBroadcastReceiver { public void onReceive(Context context, Intent intent) { Bundle extras = intent.getExtras(); GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(context); String messageType = gcm.getMessageType(intent); if (GoogleCloudMessaging.MESSAGE_TYPE_MESSAGE.equals(messageType)) { String ctpn = extras.getString(CleverTapAPI.NOTIFICATION_TAG); if(ctpn!=null && ctpn.equals("true")) { GcmBroadcastReceiver obj = new GcmBroadcastReceiver(); obj.onReceive(context, intent); } } else { MyHandler obj = new MyHandler(); obj.handlePush(intent); } } }

Jetzt werden alle Push-Benachrichtigungen über meinen Broadcast-Receiver MyBroadcastReceiver.java geleitet und entsprechend an den jeweiligen Broadcast-Handler weitergeleitet.
Falls Sie eine Benachrichtigung an alle Ihre Rundfunkempfänger weiterleiten möchten, können Sie die „Wenn sonst“-Prüfungen entfernen und einen Anruf an alle Ihre Rundfunkempfänger tätigen, wie unten gezeigt: –

 public class MyBroadcastReceiver extends WakefulBroadcastReceiver { public void onReceive(Context context, Intent intent) { Bundle extras = intent.getExtras(); GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(context); String messageType = gcm.getMessageType(intent); if (GoogleCloudMessaging.MESSAGE_TYPE_MESSAGE.equals(messageType)) { new com.clevertap.android.sdk.GcmBroadcastReceiver().onReceive(context, intent); new MyNotificaitonHandler().handleReq(intent); } }


Ich hoffe, Ihnen hat die Lektüre dieses Blogbeitrags gefallen und Sie haben ein ziemlich gutes Verständnis dafür entwickelt, wie Sie mehrere Rundfunkempfänger für Ihre Android-App einrichten.