Cómo configurar múltiples receptores de transmisión para manejar notificaciones automáticas en Android

Publicado: 2024-11-23

Los receptores de transmisión son los controladores para recibir y procesar notificaciones push enviadas a un dispositivo Android. Configurar un único receptor de transmisión para manejar notificaciones automáticas en su aplicación es un proceso sencillo.

Pero, ¿qué sucede si necesita manejar notificaciones automáticas de fuentes dispares? ¿De múltiples proveedores de notificaciones push de terceros y/o de sus propios servidores, por ejemplo?

Hay dos maneras de hacer esto.

A. Inicialización de múltiples receptores de transmisión en su AndroidManifest.xml

Cuando inicializas dos o más receptores de transmisión en el archivo AndroidManifest.xml de tu aplicación, se llama a cada uno de los métodos onReceive de esos receptores cuando tu aplicación recibe una notificación push. A continuación, tengo un código xml sobre cómo tener un receptor de transmisión para CleverTap y un receptor de transmisión para mi propia aplicación 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>

Tenga en cuenta que, aunque se invocará a ambos receptores en un mensaje entrante, es muy poco probable que se realice un doble manejo, ya que los proveedores externos ignorarán las cargas útiles que no contengan sus identificadores únicos. Si envía sus propias cargas útiles, asegúrese de incluir un identificador único propio.

Esta es la solución más simple, pero es algo ineficiente ya que se invocará a ambos receptores para cada notificación entrante.

Veamos ahora la segunda estrategia más eficiente.
B. Un receptor de transmisión común para enrutar las transmisiones a los receptores de transmisión relevantes.

En este enfoque cada vez más eficiente, usted registra sólo su propio receptor de transmisión personalizado. Luego, enruta la notificación push entrante a través de su propio receptor de transmisión, ya sea a un receptor de transmisión específico o a todos los demás receptores de transmisión. Puede utilizar su propio criterio para decidir el caso de uso de cualquiera de los enfoques antes mencionados.

En el caso de Clevertap, sabemos que su carga útil JSON contiene la clave "nm". Esto se puede utilizar para identificar una notificación push de Clevertap y reenviar la notificación al controlador de transmisión respectivo de Clevertap. De manera similar, en el caso de Parse, Appboy o Localytics, puede consultar la documentación de su API para descubrir cuál sería una forma de identificar de forma única su carga útil JSON push.
A continuación, voy a recorrer un pequeño fragmento de código donde tengo mi propio controlador de transmisión, MyBroadcastReceiver.java. Este es el controlador de transmisión a través del cual pasan todas las notificaciones automáticas. Tengo una verificación de condición para ver si un empujón provino de Clevertap y, de ser así, pasarlo al controlador de transmisión de Clevertap. De lo contrario, lo paso a mi propio controlador de carga útil JSON push. Por el bien de esta discusión, supongamos que solo espero notificaciones automáticas de Clevertap y de mis propios servidores.
Primero incluí mi controlador de transmisión en mi archivo AndroidManifest.xml de la siguiente manera: –

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

Luego creé la clase MyBroadcastReceiver de la siguiente manera:-

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

Ahora todas las notificaciones automáticas pasarán a través de mi receptor de transmisión, MyBroadcastReceiver.java y se enrutarán al controlador de transmisión respectivo en consecuencia.
En caso de que desee pasar una notificación a todos sus receptores de transmisión, puede eliminar las marcas if else y realizar una llamada a todos sus receptores de transmisión, como se muestra a continuación:

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


Espero que hayas disfrutado leyendo esta publicación de blog y hayas desarrollado una comprensión bastante buena de cómo configurar múltiples receptores de transmisión para tu aplicación de Android.