如何在 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 應用程式設定多個廣播接收器有一個很好的理解。