Como configurar vários receptores de transmissão para lidar com notificações push no Android

Publicados: 2024-11-23

Os receptores de transmissão são os manipuladores para receber e processar notificações push enviadas para um dispositivo Android. Configurar um único receptor de transmissão para lidar com notificações push em seu aplicativo é um processo simples.

Mas e se você precisar lidar com notificações push de fontes diferentes; de vários provedores de notificação push de terceiros e/ou de seus próprios servidores, por exemplo?

Existem duas maneiras de fazer isso.

A. Inicializando vários receptores de transmissão em seu AndroidManifest.xml

Quando você inicializa dois ou mais receptores de transmissão no arquivo AndroidManifest.xml do seu aplicativo, cada um dos métodos onReceive desses receptores é chamado quando o aplicativo recebe uma notificação push. Abaixo, tenho o código xml sobre como ter um receptor de transmissão para CleverTap e um receptor de transmissão para meu próprio aplicativo 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>

Observe que, embora ambos os receptores sejam invocados em uma mensagem recebida, o tratamento duplo é altamente improvável, pois provedores terceirizados ignorarão cargas úteis que não contenham seus identificadores exclusivos. Se você estiver enviando suas próprias cargas, inclua um identificador exclusivo de sua preferência.

Esta é a solução mais simples, mas é um tanto ineficiente, pois ambos os receptores serão invocados para cada notificação recebida.

Vejamos agora a segunda estratégia mais eficiente.
B. Um receptor de transmissão comum para roteamento push para os receptores de transmissão relevantes.

Nesta abordagem cada vez mais eficiente, você registra apenas seu próprio receptor de transmissão personalizado. Em seguida, você encaminha a notificação push recebida através de seu próprio receptor de transmissão para um receptor de transmissão específico ou para todos os outros receptores de transmissão. Você pode usar seu próprio critério para decidir o caso de uso de qualquer uma das abordagens mencionadas acima.

No caso do Clevertap, sabemos que a carga JSON deles contém a chave “nm”. Isso pode ser usado para identificar uma notificação push do Clevertap e encaminhar a notificação para o respectivo manipulador de transmissão do Clevertap. Da mesma forma, no caso de Parse, Appboy ou Localytics, você pode consultar a documentação da API para descobrir qual seria uma maneira de identificar exclusivamente sua carga JSON push.
Abaixo, examinarei um pequeno trecho de código onde tenho meu próprio manipulador de transmissão, MyBroadcastReceiver.java. Este é o manipulador de transmissão pelo qual passam todas as notificações push. Eu tenho uma verificação de condição para ver se um push veio do Clevertap e, em caso afirmativo, passo-o para o manipulador de transmissão do Clevertap. Caso contrário, eu o passo para meu próprio manipulador de carga JSON push. Suponha, para fins desta discussão, que estou esperando apenas notificações push do Clevertap e de meus próprios servidores.
Primeiro incluí meu manipulador de transmissão em meu arquivo AndroidManifest.xml da seguinte maneira: –

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

Então criei a classe MyBroadcastReceiver da seguinte maneira: –

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

Agora todas as notificações push passarão pelo meu receptor de transmissão, MyBroadcastReceiver.java e serão roteadas para o respectivo manipulador de transmissão de acordo.
Caso queira passar uma notificação para todos os seus receptores de transmissão, você pode remover as verificações if else e fazer uma chamada para todos os seus receptores de transmissão, conforme mostrado abaixo:-

 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 você tenha gostado de ler esta postagem do blog e desenvolvido um bom entendimento de como configurar vários receptores de transmissão para seu aplicativo Android.