Mobil Programlama

Android

Uygulama İçi İletişim

Lisans: Creative Commons 26.11.2020 tarihinde güncellendi
Bakabileceğiniz Etiketler: Eğitmen: Geleceği Yazanlar Ekibi

BroadcastReceiver yönetimden farklı olarak sadece kendi uygulamamız içinde uyarıcılar tetikleyerek sınıflar arasında haberleşme sağlayabiliriz. Bunun için yapmamız gereken bir LocalBroadcast göndermektir.

LocalBroadcast, BroadcastReceiver ile benzer mantıkta çalışır. Gönderilecek mesaj bir Intent sınıfı ile oluşturulur ve sendBroadcast metoduyla tetiklenir. Bu mesajı almak için önceden LocalBroadcastManager ile register (kayıt) olmuş sınıflar gönderilen Intent değişkenini onReceive metodu ile karşılayarak gerekli mesajı alırlar ve işlerler.

Şimdi örnek bir uygulama ile LocalBroadcast'lerin nasıl çalıştığına bakalım. Öncelikle basit bir ekranda bir düğme ve bu düğmeye basıldığında gönderilmek üzere bir uyarıcı hazırlayalım:

@Override
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
 
  MyClass.getINSTANCE(getApplicationContext());
 
  ((Button)findViewById(R.id.button)).setOnClickListener(new OnClickListener() {
 
    @Override
    public void onClick(View v) {
      LocalBroadcastManager.getInstance(MainActivity.this).sendBroadcast(new Intent(MyClass.LOCAL_NOTIFICATION_STRING));
    }
  });
}

Burada layout dosyasında tanımlanmış button adlı düğmeye basıldığında, LocalBroadcastManager üzerinden bir Intent oluşturulur ve uygulama içerisinde duyrulur. MyClass adlı sınıf Singleton bir sınıftır ve oluşturulan Intent'i karşılamak için hazırlanmıştır. Şimdi bu sınıfa göz atalım:

package com.turkcell.localbroadcast;
 
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.support.v4.content.LocalBroadcastManager;
import android.widget.Toast;
 
public class MyClass {
  public static final String LOCAL_NOTIFICATION_STRING = "my-local-notification";
  private static MyClass INSTANCE;
  private Context context;
  public static MyClass getINSTANCE(Context context) {
    if (INSTANCE == null) {
      INSTANCE = new MyClass(context);
    }
    return INSTANCE;
  }
 
  public void unregister() {
    LocalBroadcastManager.getInstance(context).unregisterReceiver(mMessageReceiver);
  }
 
  private MyClass(Context context) {
    this.context = context;
    LocalBroadcastManager.getInstance(context).registerReceiver(mMessageReceiver, new IntentFilter(LOCAL_NOTIFICATION_STRING));
   }
 
   private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
      Toast.makeText(context, "Local Notification", Toast.LENGTH_LONG).show();
    }
  };
}

LOCAL_NOTIFICATION_STRING değeri, gönderilecek uyarı mesajının anahtar değeridir ve bu değerle gönderilen uyarılar sadece bu değere kayıtlı alıcılar tarafından karşılanır. Bu sınıf içinde yaptığımız en önemli işlem, sınıfın yapıcısı (constructor) içerisinde mMessageReceiver adlı dinleyiciyi beklenen uyarıcıları almak üzere registerReceiver metoduyla kaydetmiş olmamızdır. mMessageReceiver ise gördüğümüz gibi bir BroadcastReceiver ve gelen uyarıları onReceive metodu yardımıyla karşılıyor. Biz uyarı alındığında ekrana bir Toast mesajı getirmeyi tercih ettik. Bir başka deyişle, bu koddan beklenen my-local-notification Intent değeriyle bir uyarı geldiğinde, dinleyici sınıf devreye girerek ekrana "Local Notification" şeklinde bir mesaj basılması olacaktır. unregister metodu ise dinleme işlemine ihtiyacımız kalmadığında (örn. Activity içinde onDestroy metodu) çağrılmalıdır.