Come configurare più ricevitori di trasmissione per la gestione delle notifiche push su Android
Pubblicato: 2024-11-23I ricevitori broadcast sono i gestori per la ricezione e l'elaborazione delle notifiche push inviate a un dispositivo Android. Configurare un singolo ricevitore di trasmissione per gestire le notifiche push sulla tua app è un processo semplice.
Ma cosa succede se devi gestire notifiche push da fonti disparate? da più fornitori di notifiche push di terze parti e/o dai tuoi server, ad esempio?
Ci sono due modi per farlo.
A. Inizializzazione di più ricevitori di trasmissione nel tuo AndroidManifest.xml
Quando inizializzi due o più ricevitori di trasmissione nel file AndroidManifest.xml della tua app, ciascuno dei metodi onReceive di questi ricevitori viene chiamato quando la tua app riceve una notifica push. Di seguito, ho il codice XML su come avere un ricevitore di trasmissione per CleverTap e un ricevitore di trasmissione per la mia 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>
Tieni presente che, sebbene entrambi i ricevitori verranno richiamati su un messaggio in entrata, la doppia gestione è altamente improbabile poiché i fornitori di terze parti ignoreranno i payload che non contengono i loro identificatori univoci. Se invii i tuoi payload, assicurati di includere un tuo identificatore univoco.
Questa è la soluzione più semplice, ma è alquanto inefficiente poiché entrambi i ricevitori verranno richiamati per ogni notifica in arrivo.
Consideriamo ora la seconda strategia più efficiente.
B. Un ricevitore di trasmissione comune per l'instradamento dei push ai ricevitori di trasmissione rilevanti.
In questo approccio sempre più efficiente, registri solo il tuo ricevitore di trasmissione personalizzato. Quindi instrada la notifica push in arrivo attraverso il tuo ricevitore di trasmissione a un ricevitore di trasmissione specifico o a tutti gli altri ricevitori di trasmissione. Puoi decidere a tua discrezione il caso d'uso per uno degli approcci sopra menzionati.
Nel caso di Clevertap, sappiamo che il loro payload JSON contiene la chiave “nm”. Questo può essere utilizzato per identificare una notifica push di Clevertap e inoltrare la notifica al rispettivo gestore di trasmissione di Clevertap. Allo stesso modo, nel caso di Parse o Appboy o Localytics, potresti consultare la documentazione API per capire quale sarebbe un modo per identificare in modo univoco il loro payload JSON push.
Di seguito esaminerò un piccolo pezzo di codice in cui ho il mio gestore di trasmissione, MyBroadcastReceiver.java. Questo è il gestore di trasmissione attraverso il quale passano tutte le notifiche push. Ho un controllo delle condizioni per vedere se un push è arrivato da Clevertap e, in tal caso, lo passo al gestore di trasmissione di Clevertap. Altrimenti, lo passo al mio gestore del payload JSON push. Supponiamo, ai fini di questa discussione, che mi aspetto solo notifiche push da Clevertap e dai miei server.
Per prima cosa ho incluso il mio gestore di trasmissione nel mio file AndroidManifest.xml come segue: -
<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>
Quindi ho creato la classe MyBroadcastReceiver come segue: -
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); } } }
Ora tutte le notifiche push passeranno attraverso il mio ricevitore di trasmissione, MyBroadcastReceiver.java e verranno instradate di conseguenza al rispettivo gestore di trasmissione.
Nel caso in cui desideri inviare una notifica a tutti i tuoi ricevitori di trasmissione, puoi rimuovere i controlli if else ed effettuare una chiamata a tutti i tuoi ricevitori di trasmissione, come mostrato di seguito: -
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); } }
Spero che ti sia piaciuto leggere questo post del blog e che tu abbia sviluppato una conoscenza abbastanza buona di come configurare più ricevitori di trasmissione per la tua app Android.