Cum să configurați mai multe receptoare de transmisie pentru gestionarea notificărilor push pe Android
Publicat: 2024-11-23Receptoarele de difuzare sunt handlere pentru primirea și procesarea notificărilor push trimise către un dispozitiv Android. Configurarea unui singur receptor de transmisie pentru a gestiona notificările push către aplicația dvs. este un proces simplu.
Dar ce se întâmplă dacă trebuie să gestionați notificările push din surse disparate; de la mai mulți furnizori terți de notificări push și/sau de la propriile servere, de exemplu?
Există două moduri de a face acest lucru.
A. Inițializarea mai multor receptoare de difuzare în AndroidManifest.xml
Când inițializați două sau mai multe receptoare de difuzare în fișierul AndroidManifest.xml al aplicației dvs., fiecare dintre metodele onReceive ale respectivelor receptori este apelată atunci când aplicația dvs. primește o notificare push. Mai jos, am cod xml despre cum să am un receptor de transmisie pentru CleverTap și un receptor de transmisie pentru propria mea aplicație 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>
Rețineți că, deși ambii receptori vor fi invocați într-un mesaj de intrare, manipularea dublă este foarte puțin probabilă, deoarece furnizorii terți vor ignora sarcinile care nu conțin identificatorii lor unici. Dacă trimiteți propriile sarcini utile, asigurați-vă că includeți un identificator unic al dvs.
Aceasta este cea mai simplă soluție, dar este oarecum ineficientă, deoarece ambii receptori vor fi invocați pentru fiecare notificare primită.
Să ne uităm acum la a doua strategie mai eficientă.
B. Un receptor de difuzare obișnuit pentru direcționarea împingurilor către receptoarele de difuzare relevante.
În această abordare din ce în ce mai eficientă, vă înregistrați doar propriul receptor de transmisie personalizat. Apoi trimiteți notificarea push de intrare prin propriul receptor de transmisie fie către un anumit receptor de transmisie, fie către toate celelalte receptoare de transmisie. Puteți folosi propria discreție pentru a decide cazul de utilizare pentru oricare dintre abordările menționate mai sus.
În cazul Clevertap, știm că sarcina utilă JSON de la acestea conține cheia „nm”. Aceasta poate fi folosită pentru a identifica o notificare push Clevertap și pentru a redirecționa notificarea către managerul de difuzare al Clevertap respectiv. În mod similar, în cazul Parse sau Appboy sau Localytics, ați putea să parcurgeți documentația API-ului lor pentru a afla care ar fi o modalitate de a identifica în mod unic sarcina utilă push JSON.
Mai jos voi trece printr-o mică bucată de cod în care am propriul meu handler de transmisie, MyBroadcastReceiver.java. Acesta este handlerul de difuzare prin care trec toate notificările push. Am o verificare a stării pentru a vedea dacă a venit o împingere de la Clevertap și, dacă da, o transmit managerului de difuzare al Clevertap. În caz contrar, îl transmit propriului meu handler de încărcare utilă push JSON. Să presupunem, de dragul acestei discuții, că aștept doar notificări push de la Clevertap și propriile mele servere.
Mai întâi, am inclus handlerul meu de difuzare în fișierul meu AndroidManifest.xml, după cum urmează:
<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>
Apoi am creat clasa MyBroadcastReceiver după cum urmează:
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); } } }
Acum, toate notificările push vor trece prin receptorul meu de transmisie, MyBroadcastReceiver.java și vor fi direcționate în consecință către managerul de transmisie respectiv.
În cazul în care doriți să transmiteți o notificare către toți receptorii dvs. de transmisie, puteți elimina bifările „if else” și puteți efectua un apel către toți receptorii dvs. de difuzare, după cum se arată mai jos:-
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); } }
Sper că ți-a plăcut să citești această postare pe blog și că ai dezvoltat o înțelegere destul de bună a modului de a configura mai multe receptoare de transmisie pentru aplicația ta Android.