Broadcast Receiver, ağ durumu değişiklikleri, pil seviyesi, SMS alma veya uygulama yükleme gibi sistem Broadcast mesajlarını dinleyen ve işleyen bir Android bileşenidir. Bir olay meydana geldiğinde işletim sistemi tarafından başlatılır ve görevini ana iplikte veya bir arka plan hizmeti aracılığıyla yürütür. Android Developer Guide, 2026’ya göre Broadcast Receiver, bir uygulamanın çalışmasa bile küresel sistem olaylarına tepki vermesini sağlar ve bu da onu Android ekosisteminde arka plan olay işleme için anahtar bir mekanizma haline getirir.
Önemli Noktalar
Broadcast Receiver, işletim sistemi veya diğer uygulamalar tarafından dağıtılan Intent mesajlarını almak ve işlemek için tasarlanmış bir Android bileşenidir. Activity ve Service’in aksine, Broadcast Receiver’ın kullanıcı arayüzü yoktur — görevi bir olay meydana geldiğinde kısa bir eylem gerçekleştirmektir.
Broadcast Receiver, Intent mekanizması aracılığıyla çalışır. Sistem veya bir uygulama, sendBroadcast veya sendOrderedBroadcast aracılığıyla bir Intent gönderir ve işletim sistemi bunu kayıtlı alıcılara iletir. Her alıcı, ana iplikte yürütülen onReceive yönteminde Intent’i alır.
Android Compatibility Definition Document’a göre, bir Broadcast Receiver onReceive’i 10 saniye içinde tamamlamalıdır — aksi takdirde sistem onu donmuş olarak kabul eder ve işlemi sonlandırır. Uzun süreli arka plan görevleri için, alıcıdan JobScheduler veya WorkManager başlatın.
Android iki ana Broadcast türünü destekler: Normal Broadcast ve Ordered Broadcast. Fark, teslimat sırası ve işleme zincirini kesintiye uğratma yeteneğinde yatar. Ayrıca, Broadcast’ler sistem (OS tarafından üretilen) ve özel (uygulama tarafından oluşturulan) olarak ikiye ayrılır.
Normal Broadcast, garantili sıra olmadan tüm kayıtlı alıcılara eşzamansız olarak teslim edilir. Sistem bu Broadcast’leri paralel olarak işleyebilir — her alıcı Intent’i kendi ipliğinde alır. Normal Broadcast’te abortBroadcast çağırmanın hiçbir etkisi yoktur: diğer alıcılara teslimat iptal edilemez.
Ordered Broadcast sırayla teslim edilir — her alıcıya android:priority özelliğinin azalan sırasına göre (0’dan 999’a). İşlemeden sonra, alıcı setResultExtras aracılığıyla sonucu bir sonrakine iletebilir veya abortBroadcast çağırarak zinciri kesebilir. Bu, işleme sırasının önemli olduğu senaryolarda kullanılır — örneğin SMS alıcıları.
Android birçok sistem Broadcast’i üretir: ACTION_BOOT_COMPLETED (cihaz açılışı), ACTION_BATTERY_LOW, ACTION_POWER_CONNECTED, CONNECTIVITY_ACTION, ACTION_PACKAGE_ADDED ve diğerleri. Her Intent, Extras’ta ek veriler içerir — pil seviyesi, bağlantı türü, paket adı.
| Broadcast Türü | Sıra | abortBroadcast | Performans |
|---|---|---|---|
| Normal | Garantili değil | Çalışmaz | Yüksek (paralel) |
| Ordered | Önceliğe göre | Çalışır | Orta (sıralı) |
| Sticky | Tek değer | Uygulanamaz | Düşük (API 21’den itibaren kullanımdan kaldırıldı) |
Sticky Broadcast, gönderilen son değeri saklayan kullanımdan kaldırılmış bir türdür. Bunun yerine, son durumu saklamak için LiveData, StateFlow veya paylaşılan SharedPreferences kullanın.
Broadcast Receiver iki şekilde kaydedilebilir: statik olarak AndroidManifest.xml aracılığıyla veya dinamik olarak kod içinde registerReceiver aracılığıyla. Seçim senaryoya bağlıdır: statik kayıt, uygulama çalışmasa bile çalışır; dinamik kayıt, yalnızca kaydeden bileşen aktif olduğu sürece çalışır.
Statik kayıt, manifestoda <receiver> etiketiyle <application> içinde bildirilir. Her alıcı için, işleyici sınıfı ve kesilecek eylemleri içeren bir Intent filtresi belirtilir. Sistem, uygulama çalışmasa bile bir Broadcast oluştuğunda bu alıcıları yükler.
<!-- Static Broadcast Receiver registration in manifest -->
<receiver android:name=".BootReceiver"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
Dinamik kayıt, Activity, Service veya Fragment kodunda registerReceiver yöntemi kullanılarak gerçekleştirilir. Alıcı, yalnızca onu kaydeden bileşen canlı olduğu sürece yaşar. onPause veya onDestroy’da her zaman unregisterReceiver çağırın — aksi takdirde bellek sızıntısı oluşur ve sistem işlemi sonlandırabilir.
Ordered Broadcast için teslimat sırası, android:priority özelliği tarafından belirlenir. Daha yüksek önceliğe sahip bir alıcı, Intent’i ilk önce alır. İşlemeden sonra abortBroadcast çağırırsa, daha düşük öncelikli alıcılar Intent’i almaz. Statik alıcılar için öncelik, manifestodaki Intent filtresinde ayarlanır.
Ordered Broadcast’teki alıcılar, setResultExtras veya setResultData aracılığıyla zincirdeki bir sonrakine veri iletebilir. Bu, ardışık işlem hattına olanak tanır: ilk alıcı Intent’i ek verilerle zenginleştirir, ikincisi bunları kullanır, üçüncüsü zinciri tamamlar. getResultExtras yöntemi, önceki alıcı tarafından iletilen verileri okur.
Normal Broadcast için sıra garanti edilmez, bu nedenle tüm alıcılar değiştirilmemiş orijinal Intent’i alır. Alıcıların birbirini etkilemesi gerekiyorsa, sendBroadcast yerine sendOrderedBroadcast kullanın.
Android 8 (API 26, Oreo), arka plan Broadcast’leri üzerinde önemli kısıtlamalar getirdi. Örtük Broadcast’lerin çoğu — belirli bir uygulamaya yönlendirilmemiş olanlar — artık statik kayıtla çalışmaz. Sistem, CONNECTIVITY_ACTION veya ACTION_BATTERY_LOW gibi eylemler için manifestoda kayıtlı alıcıları engeller.
Google, statik kayıtla çalışmaya devam eden Broadcast’lerin bir listesini belirledi: BOOT_COMPLETED, TIME_TICK, Alarm ve paket değişiklikleri — toplamda yaklaşık bir düzine istisna. Diğer tüm örtük Broadcast’ler artık yalnızca uygulama ön plandayken çalışan Context.registerReceiver aracılığıyla dinamik kayıt gerektirir.
Daha önce Broadcast Receiver aracılığıyla yönetilen arka plan görevleri için Android, WorkManager (yürütme garantili ertelenmiş görevler), JobScheduler (cihaz durumunu dikkate alan periyodik görevler) ve NotificationListenerService (bildirim izleme) önerir. Bu bileşenler Android 8 kısıtlamaları olmadan çalışır ve güç tüketimi için optimize edilmiştir.
Ağ bağlantısını izlemek için bir Broadcast Receiver oluşturalım. Alıcı, CONNECTIVITY_ACTION Broadcast’ini yakalayacak ve bağlantı türünü günlüğe kaydedecektir. Android 8+ için, statik kayıttan hariç tutulan örtük bir Broadcast olduğundan dinamik olarak kaydedeceğiz.
// Ağ durumu izleme için Broadcast Receiver
class NetworkReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
val cm = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
val network = cm.activeNetwork
val caps = cm.getNetworkCapabilities(network)
val connectionType = when {
caps?.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) == true -> "WiFi"
caps?.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) == true -> "Cellular"
else -> "Disconnected"
}
Log.d("NetworkReceiver", "Bağlantı türü: $connectionType")
}
}
// Activity’de dinamik kayıt
class MainActivity : AppCompatActivity() {
private val networkReceiver = NetworkReceiver()
override fun onStart() {
super.onStart()
val filter = IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)
registerReceiver(networkReceiver, filter)
}
override fun onStop() {
super.onStop()
unregisterReceiver(networkReceiver)
}
}
Alıcının kaydını her zaman onStop’ta iptal edin — Activity arka plana giderse ancak alıcı kayıtlı kalırsa, sistem kaynakları serbest bırakamaz. Service için onDestroy kullanın. Fragment’lerde, fragment yaşam döngüsünü izleyerek onStart’ta alıcıyı kaydedin ve onStop’ta kaydı iptal edin.
Sıkça Sorulan Sorular
Broadcast Receiver, sistem ve özel Broadcast mesajlarını işlemek için bir Android bileşenidir. onReceive yönteminde bir Intent alır, ana iplikte çalışır ve 10 saniye içinde tamamlanmalıdır. Uzun süreli görevler için WorkManager veya JobScheduler kullanın.
Normal Broadcast, tüm alıcılara eşzamansız ve paralel olarak teslim edilir — sıra garanti edilmez, abortBroadcast çalışmaz. Ordered Broadcast, önceliğe göre sırayla teslim edilir, her alıcı zinciri kesebilir veya setResultExtras aracılığıyla bir sonrakine veri iletebilir.
Statik kayıt (manifestoda), uygulama çalışmasa bile alıcının çalışmasına izin verir. Dinamik kayıt (registerReceiver aracılığıyla) yalnızca kaydeden bileşen aktif olduğu sürece çalışır. Android 8’den başlayarak, birçok örtük Broadcast dinamik kayıt gerektirir.
Android 8 (API 26), CONNECTIVITY_ACTION veya ACTION_BATTERY_LOW gibi örtük Broadcast’lerin çoğu için statik kaydı yasakladı. İstisnalar arasında BOOT_COMPLETED, Alarm, saat ve diğer birkaçı bulunur. Arka plan görevleri için Broadcast yerine WorkManager kullanın.
onReceive’den kullanıcı arayüzüne veri aktarmak için LiveData, StateFlow, EventBus veya LocalBroadcastManager kullanın. onReceive’den doğrudan arayüzü güncellemeye çalışmayın — ana iplikte çalışır, ancak alıcı Activity’nin görünür olduğunu garanti etmez. LocalBroadcastManager, dahili iletişim için kullanımdan kaldırılmış bir seçenektir.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun