Android에서 푸시 알림을 처리하기 위해 여러 브로드캐스트 수신기를 설정하는 방법
게시 됨: 2024-11-23Broadcast Receiver는 Android 기기로 전송된 푸시 알림을 수신하고 처리하는 핸들러입니다. 앱에 대한 푸시 알림을 처리하기 위해 단일 Broadcast Receiver를 설정하는 것은 간단한 과정입니다.
하지만 서로 다른 소스의 푸시 알림을 처리해야 하는 경우에는 어떻게 해야 할까요? 예를 들어 여러 타사 푸시 알림 제공업체 및/또는 자체 서버에서?
이를 수행하는 방법에는 두 가지가 있습니다.
A. AndroidManifest.xml에서 여러 브로드캐스트 수신기 초기화
앱의 AndroidManifest.xml 파일에서 두 개 이상의 브로드캐스트 수신기를 초기화하면 앱이 푸시 알림을 받을 때 각 수신기의 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>
수신 메시지에서 두 수신자가 모두 호출되더라도 제3자 제공자가 고유 식별자가 포함되지 않은 페이로드를 무시하므로 이중 처리가 발생할 가능성은 거의 없습니다. 자체 페이로드를 보내는 경우 고유 식별자를 포함해야 합니다.
이는 가장 간단한 솔루션이지만 들어오는 모든 알림에 대해 두 수신기가 모두 호출되므로 다소 비효율적입니다.
이제 두 번째로 효율적인 전략을 살펴보겠습니다.
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 앱에 여러 브로드캐스트 수신기를 설정하는 방법을 상당히 잘 이해하셨기를 바랍니다.