Jak skonfigurować wiele odbiorników transmisji do obsługi powiadomień push w systemie Android
Opublikowany: 2024-11-23Odbiorniki transmisji to moduły obsługi odbierania i przetwarzania powiadomień push wysyłanych na urządzenie z systemem Android. Konfigurowanie pojedynczego odbiornika transmisji do obsługi powiadomień push wysyłanych do aplikacji jest prostym procesem.
Ale co, jeśli musisz obsługiwać powiadomienia push z różnych źródeł? na przykład od wielu zewnętrznych dostawców powiadomień push i/lub z Twoich własnych serwerów?
Można to zrobić na dwa sposoby.
A. Inicjowanie wielu odbiorników transmisji w pliku AndroidManifest.xml
Jeśli zainicjujesz co najmniej dwa odbiorniki emisji w pliku AndroidManifest.xml aplikacji, każda z metod onReceive tych odbiorników zostanie wywołana, gdy aplikacja odbierze powiadomienie push. Poniżej mam kod XML pokazujący, jak mieć odbiornik transmisji dla CleverTap i odbiornik transmisji dla mojej własnej aplikacji 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>
Należy zauważyć, że chociaż oba odbiorniki zostaną wywołane w wiadomości przychodzącej, podwójna obsługa jest bardzo mało prawdopodobna, ponieważ dostawcy zewnętrzni będą ignorować ładunki, które nie zawierają ich unikalnych identyfikatorów. Jeśli wysyłasz własne ładunki, pamiętaj o dołączeniu własnego unikalnego identyfikatora.
Jest to najprostsze rozwiązanie, ale jest nieco nieefektywne, ponieważ przy każdym przychodzącym powiadomieniu wywoływani będą obaj odbiorcy.
Przyjrzyjmy się teraz drugiej, bardziej skutecznej strategii.
B. Jeden wspólny odbiornik rozgłoszeniowy do kierowania komunikatów do odpowiednich odbiorników rozgłoszeniowych.
W tym coraz bardziej wydajnym podejściu rejestrujesz tylko swój własny, niestandardowy odbiornik telewizyjny. Następnie kierujesz przychodzące powiadomienie push przez własny odbiornik rozgłoszeniowy do określonego odbiornika rozgłoszeniowego lub do wszystkich pozostałych odbiorników rozgłoszeniowych. Możesz według własnego uznania zdecydować o przypadku użycia któregokolwiek z wyżej wymienionych podejść.
W przypadku Clevertap wiemy, że ładunek JSON z nich zawiera klucz „nm”. Można to wykorzystać do zidentyfikowania powiadomienia push Clevertap i przekazania powiadomienia do odpowiedniego modułu obsługi transmisji Clevertap. Podobnie w przypadku Parse, Appboy lub Localytics możesz przejrzeć ich dokumentację API, aby dowiedzieć się, jaki byłby sposób jednoznacznej identyfikacji ich ładunku push JSON.
Poniżej przejdę przez mały fragment kodu, w którym mam własną procedurę obsługi transmisji, MyBroadcastReceiver.java. Jest to moduł obsługi rozgłaszania, przez który przechodzą wszystkie powiadomienia push. Mam sprawdzenie warunku, aby sprawdzić, czy push pochodzi od Clevertap, a jeśli tak, przekaż go do modułu obsługi transmisji Clevertap. W przeciwnym razie przekazuję go do mojego własnego modułu obsługi ładunku Push JSON. Załóżmy na potrzeby tej dyskusji, że oczekuję tylko powiadomień push od Clevertap i moich własnych serwerów.
Najpierw umieściłem moduł obsługi transmisji w moim pliku AndroidManifest.xml w następujący sposób: -
<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>
Następnie utworzyłem klasę MyBroadcastReceiver w następujący sposób: -
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); } } }
Teraz wszystkie powiadomienia push będą przechodzić przez mój odbiornik transmisji, MyBroadcastReceiver.java i zostaną odpowiednio przekierowane do odpowiedniego modułu obsługi transmisji.
Jeśli chcesz przekazać powiadomienie do wszystkich odbiorców programów, możesz usunąć zaznaczenie if else i wykonać połączenie do wszystkich odbiorców programów, jak pokazano poniżej:-
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); } }
Mam nadzieję, że podobała Ci się lektura tego wpisu na blogu i dość dobrze zrozumiałeś, jak skonfigurować wiele odbiorników transmisji dla aplikacji na Androida.