BroadcastReceiver Sınıfı ve Broadcast İşlemleri
BroadCastReciever yardımıyla bir uygulama içerisinde ya da başka bir uygulamadan başka bir uygulamaya herhangi bir mesaj gönderilebilmektedir.Aslında bu mesaj bir durumun oluştuğunu bildirmek için kullanılmaktadır. BroadCastReceiver oluşturmak için BroadCastReceiver sınıfından türetme yapmak gerekmektedir.
Broadcast dinleme işlemi Andorid'de iki şekilde yapılabilir;
- Programlama yöntemiyle
- AndroidManifest.xml dosyasında bildirerek
Bu işlemler aslında Register etme işlemleridir.Register ettikten sonra kullanılabilmektedir.Birden fazla dinleyici olması durumunda hangisinin dinleyeceği mesaj gönderilirken çağrılan metoda bağlıdır.Eğer sendBroadcast
metodu ile gönderilirse bu durumda hangisinin hangi sırayla yakalayacağının belirlenmiş bir algoritması yoktur.
sendOrderedBroadcast
metoduyla gönderildiğinde Broadcastler Receiverlar'ın öncelik sayısına göre en yüksek öncelik sırasına sahip olandan en düşük öncelik sırasına sahip olana göre yakalanır.
Programlama Yöntemiyle BroadcastReceiver'in Register edilmesi
[Dropbox]053-BroadcastReceiverProgramaticly
Programlama yöntemiyle BoradcastReciver isimli bir sınıftan türetme yapılır.Ve sınıfın onReceive
metodu override edilir.Türetme yapılan receivier'i Register etmek için context sınıfının registerReceiver
metodu kullanılmaktadır.
Bir Receiver'a bir Intent ile gönderim yapılabilir.Register yapabilmek için IntentFilter
isimli sınıfla yapılabilmektedir.
Bir Receivier'i programlama yöntemiyle Register etmek için aşağıda örnek bir kod verilmiştir.
private void init()
{
IntentFilter filter = new IntentFilter("MYBROADCASTRECEIVER");
this.registerReceiver(new MyBroadcastReceiver(), filter);
}
Bir Receiver'i unregister etmek için unRegisterReceiver
isimli metod kullanılmalıdır.
Aslında Register etmek o Recevier'ın dinlemeye geçmesi demektir.
Bir Reciverin Register işlemi çeşitli yerlerde yapılabilir.Ancak ne olursa olsun tekrar Register edilmesi gerekiyorsa en iyi yöntem Activitiy'nin onResume
metodudur.
Şüphesiz bir BroadcastReceiver
bir Thread içerisinde çalışmaktadır.BroadcastReceiver'in çalıştırdığı Thread Register edildiği noktadaki Threadde mesaj göndermeketedir.Yani programcının ayrıca bir Handler mekanizmasını kullanmasına ihtiyacı yoktur.
Aynı Action ile Register edilmiş Braodcastler aynı mesajı karşılarlar.sendBroadcast
ile gönderilen Intentin hangi sırayla karşılaşacağı belirsizdir.
IntentFilter sınıfının setPriority
metodu ile bu BroadCastReceiver'a 0-1000 aralığında öncelik değeri verilebilir.
Yüksek sayı yüksek önceliği belirler.Ancak burada dikkat edilmesi gereken priority devreye sokulmak isteniyorsa sendOrderedBroadcast
metodu ile devreye alınmalıdır.
sendOrderedBroadcast
yapıldığında yüksek öncelikli olan önce çalışacaktır.Bu durumda yüksek öncelikle olan isterse bir daha iletilmesin diyebilir.Bu işlem abortBroadcast
isimli bir metodla yapılmaktadır.abortBroadcast
çağrıldıktan sonra artık diğer recieverlar bu gönderimi alamayacaktır.
AndroidManifest.xml içerisinde Recevier Register Edilmesi
Bu işlem için Recevier isimli bir Tag kullanılmaktadır.Bu Tag ile ilgili BroadcastReciever
ilgili isim ve ilgili sınıf için Register edilebilmektedir.Bunun için Receiver içierisinde IntentFilter
elemanı kullanılmalıdır.IntentFilter içerisinde Action ismi Register edilen Receiver'in adıdır.
Receiver elemanının genel şekli şu şekilde olabilir.
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</receiver>
Priority gibi bilgilerde Android Manifest'de de belirtilebilmektedir.
<receiver android:name= ".MyBroadcastReceiver">
<intent-filter android:priority="30">
<action android:name="BROADCASTRECEIVER"/>
</intent-filter>
</receiver>
IntentFilter içerisinde android:name
elemanı içerisinde bildirilen sınıf ismi eğer tam ismiyle verilirse dışarıdan da erişilebilir duruma gelecektir.Aslında bu durum Intent kullanan tüm elemanlar için geçerlidir.Zaten intentFilter'da bu belirlemeleri yapmak için kullanılan bir xml elemanı (aynı zamanda bir sınıfı)dır.Bu ismin noktayla belirtilmesi bu uygulama içerisinde kullanılcağı anlamındadır.
Özetle bir BroadcastReceiver sınıfı birden fazla dinleme yapabilir.Benzer şekilde bir Broadcast sınıfı birden fazla isimle Register yapılıp dinleme yapabilir.ve birden fazla Broadcast sınıfı birden fazla ya da aynı isimde Register edilebilir. Bu duruma programcı karar vermelidir.