ResultReciver Sınıfı Ile Servis Işlemleri
ResultReciver sınıfı processler arası haberleşmede kullanılabilecek bir çok karmaşık işlemi kendi içerisinde halletmiş bir sınıftır.ResultReciver sınıfı Parcelable bir sınıftır. ResultReciver genel çalışma prensibi şöyledir.
- IntentService sınıfından bir sınıf türetilir.Bu sınıf içerisinde onHandleIntent metodu override edilerek client programdan gelen istek karşılanır.
- Karşılanan isteğe göre ResultReciver sınıfının
send
metodu kullanılarak client programa bir Bundle ile bilgi gönderilir.Client programda ilgili servisi başlatır ve bir callback metod ile gelen sonucu dinler.Burada intentService kullanımı tamamen işi kolaylaştırmak içindir.Yoksa servis sınıfından da türetilebilir.
[Dropbox]080-ResultReceiverService
Dropbox]080-ResultReceiverService ne yapar?
ResultReceiverService
Bağlanılacak servis ve lokalden bu servisi kullanma kodu yazıldı.
onHandleIntent de intent parametresının getParcelableExtra diyerek resultReceiver türünden geri dönüşü olan anahtar sözcüğü bilinen data alınır.
Bu data içerisinde hasExtra ile aranan mesaj var mı yok mu kontrol edililir. geri cevap vermek için send diyerek dönülür.
Butona basılınca da client olarak servise bağlanılır.
Gui threadde handler oluşturulur.handlela ResultReciver açılır ve onReceiveResult metodu yazılır. client alma işlemini burda yapar.
Mesaj gönderip alma işlemi bundle yardımıyla yapıldığı için bu bundlelara ilişkin anahtarın iki tarafta da bilinmesi gerekmektedir.
onHandleIntent içerisinde ResultReceiver türünden bir referans alınır.
ResultReceiver sınıfı lokal servis olarak da kullanılabilir.
Client tarafta ResultReceiver sınıfın onReceiveResult
metodu ile sonuç alınabilir.
ResultReceiver rr = new ResultReceiver(m_handler)
{
@Override
protected void onReceiveResult(int resultCode, Bundle resultData)
{
super.onReceiveResult(resultCode, resultData);
}
};
onReceiveResult
metodunun
- parametresi servis tarafından gönderilen result kodudur.
- parametresi ise service tarafından gönderilen bundle referansıdır.
onReceiveResult
içerisinde verilen Handler'a ilişkin işlem yapılabilir.
Clientın data göndermekte kullanacağı kod aşağıdaki gibi yazılabilmektedir.
public void doClick(View v)
{
Intent intent = new Intent(this, ResultReceiverService.class);
intent.putExtra("MERHABA", "MERHABA");
intent.putExtra("MESSAGE", rr);
this.startService(intent);
}
Farklı processlerden bağlantı durumunda ResultRecevier
sınıfı içsel olarak hallettiğinden programcının onBind
metodunu yazması gerekmez. Bu işlem doğrudan yapılabilir.
Android Servisler içierisinde Procesler arası haberleşmenin en kolay yapıldığı yöntem ResultReciver sınıfıdır.ResultReciver ile programcının ayrıca binder işlemlerini yapması gerekmez.Fakat unutulmamalıdırki kullanım açısından bakıldığında bu bir servis gibi çalışmaz.Aslında birbirlerine bilgi gönderen ve bu bilginin anlamına göre işlem yapıp yine sonucu gönderen mantıksal bir servistir.
Anahtar Notlar:
Servisler başka makinalardaki processler arasındaki haberleşmede doğrudan kullanılamazlar.Başka makinalar arasında haberleşmede kullanılan servisler için Android işletim sistemindeki uygulama bir hizmet alan uygulama(consumer) olarak yazılmalıdır ve ya daha aşağı seviyeli olarak TCP/IP uygulamarı yazılabilir.