Android でプッシュ通知を処理するために複数のブロードキャスト レシーバーをセットアップする方法

公開: 2024-11-23

ブロードキャスト レシーバーは、Android デバイスに送信されたプッシュ通知を受信して​​処理するためのハンドラーです。アプリへのプッシュ通知を処理するために単一のブロードキャスト レシーバーを設定するのは簡単なプロセスです。

しかし、異なるソースからのプッシュ通知を処理する必要がある場合はどうすればよいでしょうか。たとえば、複数のサードパーティのプッシュ通知プロバイダーから、および/または独自のサーバーから?

これを行うには 2 つの方法があります。

A. AndroidManifest.xml で複数のブロードキャスト レシーバーを初期化する

アプリの AndroidManifest.xml ファイルで 2 つ以上のブロードキャスト レシーバーを初期化すると、アプリがプッシュ通知を受信したときに、それらの各レシーバーの onReceive メソッドが呼び出されます。以下に、CleverTap 用のブロードキャスト レシーバーと、独自のアプリ LocalBot 用のブロードキャスト レシーバーを設定する方法の 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.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>

両方の受信者が受信メッセージで呼び出されますが、サードパーティのプロバイダーは一意の識別子を含まないペイロードを無視するため、二重処理が発生する可能性は非常に低いことに注意してください。 独自のペイロードを送信する場合は、必ず独自の一意の識別子を含めてください。

これは最も単純な解決策ですが、受信通知ごとに両方のレシーバーが呼び出されるため、やや非効率的です。

次に、2 番目のより効率的な戦略を見てみましょう。
B. 関連するブロードキャスト レシーバーにプッシュをルーティングするための 1 つの共通ブロードキャスト レシーバー。

この段階的に効率的なアプローチでは、独自のカスタム ブロードキャスト レシーバーのみを登録します。次に、受信プッシュ通知を独自のブロードキャスト レシーバー経由で、特定のブロードキャスト レシーバーまたは他のすべてのブロードキャスト レシーバーにルーティングします。前述のいずれかのアプローチの使用例を独自の裁量で決定できます。

Clevertap の場合、それらの JSON ペイロードにキー「nm」が含まれていることがわかります。これを使用して、Clvertap プッシュ通知を識別し、その通知を Clvertap のそれぞれのブロードキャスト ハンドラーに転送できます。同様に、Parse、Appboy、Localytics の場合は、API ドキュメントを参照して、プッシュ JSON ペイロードを一意に識別する方法を見つけることができます。
以下では、独自のブロードキャスト ハンドラー MyBroadcastReceiver.java を使用する小さなコードを説明します。これは、すべてのプッシュ通知が通過するブロードキャスト ハンドラーです。プッシュが Clevertap から来たかどうかを確認する条件チェックがあり、そうである場合は、それを Clvertap のブロードキャスト ハンドラーに渡します。それ以外の場合は、それを独自のプッシュ 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 アプリ用に複数のブロードキャスト レシーバーをセットアップする方法について十分に理解していただければ幸いです。