Как настроить несколько приемников вещания для обработки push-уведомлений на Android

Опубликовано: 2024-11-23

Приёмники широковещательной рассылки — это обработчики получения и обработки push-уведомлений, отправляемых на устройство Android. Настройка единого широковещательного приемника для обработки push-уведомлений вашего приложения — простой процесс.

Но что, если вам нужно обрабатывать push-уведомления из разных источников? например, от нескольких сторонних поставщиков push-уведомлений и/или с ваших собственных серверов?

Есть два способа сделать это.

А. Инициализация нескольких приемников вещания в AndroidManifest.xml.

Когда вы инициализируете два или более приемников широковещательной передачи в файле AndroidManifest.xml вашего приложения, каждый из методов onReceive этих приемников вызывается, когда ваше приложение получает push-уведомление. Ниже у меня есть XML-код о том, как создать приемник широковещательных сообщений для CleverTap и приемник широковещательных сообщений для моего собственного приложения 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>

Обратите внимание: хотя оба получателя будут вызваны для входящего сообщения, двойная обработка маловероятна, поскольку сторонние поставщики будут игнорировать полезные данные, которые не содержат их уникальные идентификаторы. Если вы отправляете свои собственные полезные данные, обязательно укажите собственный уникальный идентификатор.

Это самое простое решение, но оно несколько неэффективно, поскольку для каждого входящего уведомления будут вызываться оба получателя.

Давайте теперь посмотрим на вторую, более эффективную стратегию.
Б. Один общий широковещательный приемник для маршрутизации передачи сообщений соответствующим широковещательным приемникам.

При этом более эффективном подходе вы регистрируете только свой собственный приемник вещания. Затем вы направляете входящее push-уведомление через свой собственный приемник вещания либо конкретному приемнику вещания, либо всем остальным приемникам вещания. Вы можете по своему усмотрению решить вариант использования любого из вышеупомянутых подходов.

В случае с Clevertap мы знаем, что полезная нагрузка JSON от них содержит ключ «nm». Это можно использовать для идентификации push-уведомлений Clevertap и пересылки уведомления соответствующему обработчику широковещательной рассылки Clevertap. Аналогично, в случае с Parse, Appboy или Localytics вы можете просмотреть их документацию по API, чтобы выяснить, каким образом можно однозначно идентифицировать их полезную нагрузку push JSON.
Ниже я рассмотрю небольшой фрагмент кода, в котором у меня есть собственный обработчик широковещания MyBroadcastReceiver.java. Это обработчик трансляции, через который проходят все push-уведомления. У меня есть проверка условия, чтобы узнать, поступил ли push-уведомление от Clevertap, и если да, то передать его обработчику широковещательной рассылки Clevertap. В противном случае я передаю его своему собственному обработчику полезной нагрузки JSON. В целях обсуждения предположим, что я ожидаю push-уведомлений только от Clevertap и моих собственных серверов.
Сначала я включил обработчик трансляции в файл AndroidManifest.xml следующим образом:

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

Затем я создал класс MyBroadcastReceiver следующим образом:

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); } } }

Теперь все push-уведомления будут проходить через мой приемник вещания MyBroadcastReceiver.java и соответственно перенаправляться на соответствующий обработчик вещания.
Если вы хотите передать уведомление всем вашим вещательным приемникам, вы можете удалить проверки if else и выполнить вызов всем вашим вещательным приемникам, как показано ниже:

 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); } }


Надеюсь, вам понравилось читать эту публикацию в блоге, и вы достаточно хорошо поняли, как настроить несколько приемников вещания для вашего приложения для Android.