Mobil Programlama

Android

BroadcastReceiver Kullanımı

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

BroadCastReceiver işletim sistemi tarafından uygulamalara gönderilen sinyalleri dinlemek ve takip etmekle görevlidir. Bu sinyaller işletim sistemiyle birlikte gelen sistem uygulamaları tarafından oluşturulabileceği gibi market üzerinden indirilen uygulamalar tarafından da gönderilebilir. Bu şekilde uygulamamız telefona gelen çağrılardan, kısa mesajlardan ve diğer olaylardan haberdar olacak.

Bir nesneye BroadCastReceiver özelliği eklememiz için ilk olarak o nesneyi AndroidManifest dosyasının içindeki application etiketinin içine eklememiz gerekiyor. Bu şekilde uygulamamız işletim sisteminin gönderdiği sinyalleri alma yetkisi kazanacak.

<receiver android:name=".receiver.SMSReceiver" >
    <intent-filter>
        <action android:name="android.provider.Telephony.SMS_RECEIVED" />
    </intent-filter>
</receiver>

Yukarıdaki örnekte SmsReceiver adında bir BroadCastReceiver sınıfı oluşturduk. Bu sınıfın amacı telefona bir kısa mesaj geldiğinde harekete geçerek mesajla ilgili eylemi gerçekleştirmek olacak.

İşletim sistemi bir uyarı yayınladığında BroadCastReceiver içindeki onReceive metodu harekete geçer. Bu şekilde gelen uyarı her ne ise bu metot içinde uyarıyla ilgili eylem gerçekleştirme şansımız olur. Şimdi sıkça karşımıza çıkan bir örnek olarak SMS’leri karşılamaya göz atalım.

 

SMS almak

İlk olarak projemizde SmsReceiver.java adlı bir dosya yaratarak aşağıdaki şekilde düzenliyoruz.


package org.tcellgy.and401.bcast.receiver;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;
import android.util.Log;
import android.widget.Toast;

public class SMSReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {

	Bundle pudsBundle = intent.getExtras();
	Object[] pdus = (Object[]) pudsBundle.get("pdus");
	SmsMessage messages = SmsMessage.createFromPdu((byte[]) pdus[0]);
	Toast.makeText(context, "Yeni SMS: " + messages.getMessageBody(),
		Toast.LENGTH_LONG).show();
	Log.d(getClass().getName().toString(), "yeni sms geldi");
    }

}

AndroidManifest dosyasında daha önce anlatılan ayarı yaptığımızda, işletim sistemine bir kısa mesaj geldiğinde SmsReceiver içindeki onReceive metodu harekete geçer. Intent parametresi gelen uyarıyla ilgili bilgi içermektedir. Context ise uygulamamıza erişmemizi sağlar. getExtras metoduyla intent içerisinde bize yollanan parametreleri alırız. Bir kısa mesajın içeriğine erişmek için pdu adı verilen paketi çekmemiz gerekir. Bir byte dizisi olarak gönderilen pdu, Android SDK ile birlikte gelen SmsMessage sınıfındaki createFromPdu static metoduyla bir SmsMessage sınıfına dönüştürülür. Mesajın içeriğini çekmek içinse getMessageBody metodunu kullanırız.

Toast, Android SDK ile gelen ve ekrana kısa süreli bir mesaj çıkaran yardımcı sınıftır. Bu mesaj ekranda birkaç saniye görüntülendikten sonra kendiliğinden kaybolur. Bu metodu kullanarak her yeni kısa mesajda ekrana mesajın içeriğini basabiliriz. Bundan sonra uygulamaya yeni mesaj geldiğinde uygulama kapalı da olsa ekrana küçük bir uyarı kutucuğu çıkacak ve mesajın içeriği görüntülenecektir.

 

Uçak modu algılanması

BroadcastReceiver yardımıyla telefondaki her türlü değişikliğin algılanması mümkündür. Şimdiki örnekte kullanıcı tarafından uçak moduna alındığında telefonun 2 saniye boyunca titreşime girmesini sağlayan bir uygulama göstereceğiz. Öncelikle AndroidManifest dosyasında titreşimle ilgili izinleri tanımlayalım.

<uses-permission android:name="android.permission.VIBRATE" />

Daha sonra uçak modu durumunu yakalayacak sınıfımızı oluşturalım.

package org.tcellgy.and401.bcast.receiver;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Vibrator;
import android.util.Log;

public class AirplaneModeReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
	Vibrator vibrator = (Vibrator) context
		.getSystemService(Context.VIBRATOR_SERVICE);
	vibrator.vibrate(2000);
	Log.d(getClass().getName().toString(), "Titredi");
    }

}

AirplaneModeReceiver adlı bu sınıf, Vibrator sınıfı içerisindeki vibrate metodu yardımıyla telefonu 2 saniye boyunca titreşime sokar. Şimdi tek yapmamız gereken, AndroidManifest dosyasında AirplaneModeReceiver adlı sınıfı receiver olarak tanımlamaktır.

<receiver android:name=".receiver.AirplaneModeReceiver" >
    <intent-filter>
        <action android:name="android.intent.action.AIRPLANE_MODE" />
    </intent-filter>
</receiver>

Bu değişiklikten sonra telefon uçak moduna alındığında 2 saniye boyunca titreşime girer.

 

Kendimize receiver (alıcı) yaratmak

İşletim sistemi tarafından öntanımlı sunulan receiver (alıcı) kodları dışında kendi receiver kodlarımızı da yaratabiliriz. Bunun için yapmamız gereken, AndroidManifest dosyasında alıcı belirtirken android:name değerini kendi anahtar değerimizle değiştirmektir.

<receiver
            android:name=".receiver.MyReceiver"
            android:exported="false" >
            <intent-filter>
                <action android:name="org.tcellgy.intent.TITRESIM_INTENT" />
            </intent-filter>
        </receiver>

Yukarıdaki tanıma göre MyReceiver sınıfı org.tcellgy.intent.TITRESIM_INTENT adında eylemi olan BroadCast gönderildiğinde uyarılacak ve onReceive metodu harekete geçecektir. Bir BroadCast göndermek için aşağıdaki metodu kaynak kod içerisinde çağırmamız gerekir.

Intent intent = new Intent();
intent.setAction("org.tcellgy.intent.TITRESIM_INTENT");
sendBroadcast(intent);

sendBroadcast metodu yardımıyla AndroidManifest içinde kaydolmuş receiver sınıfları mesajımızı alacak.
 



Herşey yolunda gittiğinde uygulamanız yukarıdaki gibi görünecek.

 

NOT: Bu örnek uygulamayı telefonunuza kurduğunuzda, birlikte gelen özellikler uygulamayı kaldırana kadar arka planda çalışmaya devam edecektir.