Cara mengatur beberapa penerima siaran untuk menangani notifikasi push di Android
Diterbitkan: 2024-11-23Penerima siaran adalah penangan untuk menerima dan memproses pemberitahuan push yang dikirim ke perangkat android. Menyiapkan satu penerima siaran untuk menangani pemberitahuan push ke aplikasi Anda adalah proses yang mudah.
Namun bagaimana jika Anda perlu menangani pemberitahuan push dari sumber yang berbeda; dari beberapa penyedia pemberitahuan push pihak ketiga dan/atau dari server Anda sendiri, misalnya?
Ada dua cara untuk melakukan hal ini.
A. Menginisialisasi beberapa penerima siaran di AndroidManifest.xml Anda
Saat Anda menginisialisasi dua atau lebih penerima siaran di file AndroidManifest.xml aplikasi Anda, masing-masing metode onReceive penerima tersebut akan dipanggil saat aplikasi Anda menerima notifikasi push. Di bawah ini, saya memiliki kode xml tentang cara memiliki penerima siaran untuk CleverTap dan penerima siaran untuk aplikasi LocalBot saya sendiri.
<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>
Perhatikan bahwa, meskipun kedua penerima akan dipanggil pada pesan masuk, penanganan ganda sangat kecil kemungkinannya karena penyedia pihak ketiga akan mengabaikan payload yang tidak berisi pengidentifikasi uniknya. Jika Anda mengirim muatan Anda sendiri, pastikan untuk menyertakan pengenal unik Anda sendiri.
Ini adalah solusi paling sederhana, namun agak tidak efisien karena kedua penerima akan dipanggil untuk setiap notifikasi masuk.
Sekarang mari kita lihat strategi kedua yang lebih efisien.
B. Satu penerima siaran umum untuk routing mendorong ke penerima siaran yang relevan.
Dalam pendekatan yang lebih efisien secara bertahap ini, Anda hanya mendaftarkan penerima siaran khusus Anda sendiri. Anda kemudian mengarahkan pemberitahuan push yang masuk melalui penerima siaran Anda sendiri ke penerima siaran tertentu atau ke semua penerima siaran lainnya. Anda dapat menggunakan kebijaksanaan Anda sendiri untuk memutuskan kasus penggunaan salah satu pendekatan yang disebutkan di atas.
Dalam kasus Clevertap, kita tahu bahwa payload JSON dari mereka berisi kunci “nm”. Ini dapat digunakan untuk mengidentifikasi pemberitahuan push Clevertap dan meneruskan pemberitahuan tersebut ke pengendali siaran Clevertap masing-masing. Demikian pula, dalam kasus Parse atau Appboy atau Localytics, Anda dapat melihat dokumentasi API mereka untuk mencari tahu cara apa yang dapat mengidentifikasi secara unik payload JSON push mereka.
Di bawah ini saya akan membahas sepotong kecil kode di mana saya memiliki pengendali siaran saya sendiri, MyBroadcastReceiver.java. Ini adalah pengendali siaran yang dilalui semua pemberitahuan push. Saya memiliki pemeriksaan kondisi untuk melihat apakah dorongan datang dari Clevertap, dan jika demikian, teruskan ke pengendali siaran Clevertap. Kalau tidak, saya meneruskannya ke penangan muatan JSON push saya sendiri. Asumsikan demi diskusi ini bahwa saya hanya mengharapkan pemberitahuan push dari Clevertap dan server saya sendiri.
Pertama saya menyertakan pengendali siaran saya di file AndroidManifest.xml saya sebagai berikut: -
<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>
Kemudian saya membuat kelas MyBroadcastReceiver sebagai berikut:-
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); } } }
Sekarang semua pemberitahuan push akan melewati penerima siaran saya, MyBroadcastReceiver.java dan akan dialihkan ke masing-masing pengendali siaran.
Jika Anda ingin meneruskan pemberitahuan ke semua penerima siaran Anda, Anda dapat menghapus centang if else dan melakukan panggilan ke semua penerima siaran Anda, seperti yang ditunjukkan di bawah ini:-
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); } }
Semoga Anda menikmati membaca postingan blog ini dan mengembangkan pemahaman yang cukup baik tentang cara mengatur beberapa penerima siaran untuk aplikasi Android Anda.