如何在 Android 上设置多个广播接收器来处理推送通知
已发表: 2024-11-23广播接收器是用于接收和处理发送到 Android 设备的推送通知的处理程序。设置单个广播接收器来处理应用程序的推送通知是一个简单的过程。
但是,如果您需要处理来自不同来源的推送通知怎么办?例如,来自多个第三方推送通知提供商和/或来自您自己的服务器?
有两种方法可以做到这一点。
A. 在 AndroidManifest.xml 中初始化多个广播接收器
当您在应用的 AndroidManifest.xml 文件中初始化两个或多个广播接收器时,当您的应用收到推送通知时,将调用每个接收器的 onReceive 方法。下面,我有 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>
请注意,尽管将在传入消息上调用两个接收器,但双重处理的可能性极小,因为第三方提供商将忽略不包含其唯一标识符的有效负载。 如果您要发送自己的有效负载,请务必包含您自己的唯一标识符。
这是最简单的解决方案,但效率有些低,因为每个传入通知都会调用两个接收器。
现在让我们看看第二种更有效的策略。
B. 一个公共广播接收器用于路由推送到相关广播接收器。
在这种逐渐提高效率的方法中,您只需注册自己的自定义广播接收器。然后,您可以通过自己的广播接收器将传入的推送通知路由到特定广播接收器或所有其他广播接收器。您可以自行决定上述任一方法的用例。
对于 Clevertap,我们知道它们的 JSON 有效负载包含键“nm”。这可用于识别 Clevertap 推送通知并将通知转发到 Clevertap 各自的广播处理程序。同样,对于 Parse、Appboy 或 Localytics,您可以浏览他们的 API 文档,找出唯一标识其推送 JSON 负载的方法。
下面我将演练一小段代码,其中我有自己的广播处理程序 MyBroadcastReceiver.java。这是所有推送通知都通过的广播处理程序。我有一个条件检查来查看推送是否来自 Clevertap,如果是,则将其传递到 Clevertap 的广播处理程序。否则,我会将其传递给我自己的推送 JSON 负载处理程序。为了便于讨论,假设我只期待来自 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); } } }
现在,所有推送通知都将通过我的广播接收器 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 应用程序设置多个广播接收器有一个很好的理解。