Android'de anlık bildirimleri işlemek için birden fazla yayın alıcısı nasıl kurulur
Yayınlanan: 2024-11-23Yayın alıcıları, bir android cihaza gönderilen anlık bildirimleri almak ve işlemek için kullanılan işleyicilerdir. Uygulamanıza gönderilen anlık bildirimleri yönetmek için tek bir yayın alıcısı ayarlamak basit bir işlemdir.
Peki ya farklı kaynaklardan gelen anlık bildirimlerle uğraşmanız gerekiyorsa; örneğin birden fazla üçüncü taraf anlık bildirim sağlayıcısından ve/veya kendi sunucularınızdan mı?
Bunu yapmanın iki yolu var.
A. AndroidManifest.xml dosyanızda birden fazla yayın alıcısının başlatılması
Uygulamanızın AndroidManifest.xml dosyasında iki veya daha fazla yayın alıcısını başlattığınızda, uygulamanız bir anında bildirim aldığında bu alıcının onReceive yöntemlerinin her biri çağrılır. Aşağıda, CleverTap için bir yayın alıcısına ve kendi uygulamam LocalBot için bir yayın alıcısına nasıl sahip olacağıma dair xml kodum var.
<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>
Her ne kadar gelen bir mesajda her iki alıcı da çağrılacak olsa da, üçüncü taraf sağlayıcılar kendi benzersiz tanımlayıcılarını içermeyen yükleri göz ardı edeceğinden çifte işleme ihtimalinin oldukça düşük olduğunu unutmayın. Kendi yüklerinizi gönderiyorsanız kendinize ait benzersiz bir tanımlayıcı eklediğinizden emin olun.
Bu en basit çözümdür ancak gelen her bildirim için her iki alıcı da çağrılacağından biraz verimsizdir.
Şimdi ikinci daha etkili stratejiye bakalım.
B. İletimleri ilgili yayın alıcılarına yönlendirmek için ortak bir yayın alıcısı.
Bu giderek daha verimli yaklaşımda, yalnızca kendi özel yayın alıcınızı kaydedersiniz. Daha sonra gelen anlık bildirimi kendi yayın alıcınız üzerinden belirli bir yayın alıcısına veya diğer tüm yayın alıcılarına yönlendirirsiniz. Yukarıda belirtilen yaklaşımlardan herhangi birinin kullanım durumuna karar vermek için kendi takdirinizi kullanabilirsiniz.
Clevertap durumunda, onlardan gelen JSON yükünün “nm” anahtarını içerdiğini biliyoruz. Bu, bir Clevertap anlık bildirimini tanımlamak ve bildirimi Clevertap'in ilgili yayın işleyicisine iletmek için kullanılabilir. Benzer şekilde, Parse, Appboy veya Localytics söz konusu olduğunda, onların Push JSON yükünü benzersiz şekilde tanımlamanın bir yolunun ne olabileceğini bulmak için API belgelerini inceleyebilirsiniz.
Aşağıda kendi yayın işleyicim olan MyBroadcastReceiver.java'nın bulunduğu küçük bir kod parçasından geçeceğim. Bu, tüm anında bildirimlerin geçtiği yayın işleyicisidir. Bir gönderimin Clevertap'tan gelip gelmediğini görmek için bir durum kontrolüm var ve eğer öyleyse, bunu Clevertap'in yayın işleyicisine aktarın. Aksi halde bunu kendi JSON yük işleyicime aktarırım. Bu tartışmanın hatrına, yalnızca Clevertap'tan ve kendi sunucularımdan anlık bildirimler beklediğimi varsayalım.
Öncelikle yayın işleyicimi AndroidManifest.xml dosyama şu şekilde ekledim:-
<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>
Daha sonra MyBroadcastReceiver sınıfını şu şekilde oluşturdum: -
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); } } }
Artık tüm anlık bildirimler yayın alıcım MyBroadcastReceiver.java üzerinden geçecek ve buna göre ilgili yayın işleyicisine yönlendirilecek.
Tüm yayın alıcılarınıza bir bildirim iletmek isterseniz, if else kontrollerini kaldırabilir ve aşağıda gösterildiği gibi tüm yayın alıcılarınızı arayabilirsiniz:-
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); } }
Umarım bu blog yazısını okumaktan keyif almışsınızdır ve android uygulamanız için birden fazla yayın alıcısının nasıl kurulacağı konusunda oldukça iyi bir anlayış geliştirmişsinizdir.