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;

  1. Programlama yöntemiyle
  2. 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.