Broadcast Receiver — Android komponentidir, sistem Broadcast mesajlarını dinləyir və emal edir, məsələn şəbəkə vəziyyətinin dəyişməsi, batareya doldurma səviyyəsi, SMS qəbulu və ya proqram quraşdırılması. O, hadisə baş verdikdə əməliyyat sistemi tərəfindən işə salınır və tapşırığı əsas axında və ya fon xidməti vasitəsilə yerinə yetirir. Android Developer Guide, 2026-ya görə, Broadcast Receiver proqrama işə salınmamış olsa belə qlobal sistem hadisələrinə reaksiya verməyə imkan verir ki, bu da onu Android ekosistemində fon hadisələrinin emalı üçün əsas mexanizm edir.
Əsas məqamlar
Broadcast Receiver — əməliyyat sistemi və ya digər proqramlar tərəfindən yayılan Intent mesajlarını qəbul etmək və emal etmək üçün nəzərdə tutulmuş Android komponentidir. Activity və Service-dən fərqli olaraq, Broadcast Receiver-in istifadəçi interfeysi yoxdur — onun vəzifəsi hadisə baş verdikdə qısa bir tapşırığı yerinə yetirməkdir.
Broadcast Receiver Intent mexanizmi vasitəsilə işləyir. Sistem və ya proqram sendBroadcast və ya sendOrderedBroadcast vasitəsilə Intent göndərir, əməliyyat sistemi isə onu qeydiyyatdan keçmiş qəbuledicilərə çatdırır. Hər bir qəbuledici onReceive metodunda Intent alır, bu metod əsas axında icra olunur.
Android Compatibility Definition Document-a görə, Broadcast Receiver onReceive-i 10 saniyə ərzində bitirməlidir — əks halda sistem onu donmuş hesab edir və prosesi dayandırır. Uzun müddətli fon tapşırıqları üçün qəbuledicidən işə salınan JobScheduler və ya WorkManager istifadə edin.
Android iki əsas Broadcast növünü dəstəkləyir: Normal Broadcast və Ordered Broadcast. Fərq çatdırılma sırası və emal zəncirini kəsmə imkanındadır. Bundan əlavə, Broadcast-lər sistem (OS tərəfindən yaradılan) və istifadəçi (proqram tərəfindən yaradılan) olaraq bölünür.
Normal Broadcast bütün qeydiyyatdan keçmiş qəbuledicilərə asinxron və zəmanətli sıra olmadan çatdırılır. Sistem bu cür Broadcast-ləri paralel emal edə bilər — hər bir qəbuledici Intent-i öz axınında alır. Normal Broadcast-də abortBroadcast çağırışının effekti yoxdur: digər qəbuledicilərə çatdırılmanı ləğv etmək mümkün deyil.
Ordered Broadcast ardıcıl çatdırılır — hər bir qəbulediciyə android:priority atributunun azalma sırası ilə (0-dan 999-a qədər). Emaldan sonra qəbuledici setResultExtras vasitəsilə nəticəni növbəti qəbulediciyə ötürə və ya abortBroadcast çağırışı ilə zənciri kəsə bilər. Bu, emal sırasının vacib olduğu hallarda istifadə olunur — məsələn, SMS qəbulediciləri.
Android çox sayda sistem Broadcast-i yaradır: ACTION_BOOT_COMPLETED (cihazın yüklənməsi), ACTION_BATTERY_LOW, ACTION_POWER_CONNECTED, CONNECTIVITY_ACTION, ACTION_PACKAGE_ADDED və digərləri. Hər bir Intent Extras-da əlavə məlumatlar ehtiva edir — doldurma səviyyəsi, qoşulma növü, paket adı.
| Broadcast növü | Sıra | abortBroadcast | Performans |
|---|---|---|---|
| Normal | Zəmanətli deyil | İşləmir | Yüksək (paralel) |
| Ordered | Prioritetə görə | İşləyir | Orta (ardıcıl) |
| Sticky | Tək dəyər | Tətbiq edilmir | Aşağı (API 21-dən etibarən köhnəlmiş) |
Sticky Broadcast — son göndərilmiş dəyəri saxlayan köhnəlmiş tip. Bunun əvəzinə son vəziyyəti saxlamaq üçün LiveData, StateFlow və ya paylaşılan SharedPreferences istifadə edin.
Broadcast Receiver iki yolla qeydiyyatdan keçirilə bilər: statik olaraq AndroidManifest.xml vasitəsilə və ya dinamik olaraq koddan registerReceiver vasitəsilə. Seçim ssenaridən asılıdır: statik qeydiyyat proqram işə salınmamış olsa belə işləyir, dinamik qeydiyyat isə yalnız qeydiyyatdan keçirən komponent aktiv olduqda işləyir.
Statik qeydiyyat manifestdə <receiver> teqi ilə <application> daxilində elan edilir. Hər bir qəbuledici üçün emalçı sinif və tutmalı olduğu Intent filtri göstərilir. Sistem Broadcast baş verdikdə bu cür qəbulediciləri proqram işə salınmamış olsa belə yükləyir.
<!-- 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 qeydiyyat Activity, Service və ya Fragment kodunda registerReceiver metodu ilə həyata keçirilir. Qəbuledici yalnız onu qeydiyyatdan keçirən komponent yaşadığı müddətdə fəaliyyət göstərir. onPause və ya onDestroy-də mütləq unregisterReceiver çağırın — əks halda yaddaş sızması baş verəcək və sistem prosesi dayandıra bilər.
Ordered Broadcast üçün çatdırılma sırası android:priority atributu ilə müəyyən edilir. Daha yüksək prioritetə malik qəbuledici Intent-i daha tez alır. Emaldan sonra abortBroadcast çağırarsa, aşağı prioritetli qəbuledicilər Intent-i almır. Statik qəbuledicilər üçün prioritet manifestdə Intent filtrində təyin edilir.
Ordered Broadcast-də qəbuledicilər setResultExtras və ya setResultData vasitəsilə zəncirdəki növbəti qəbulediciyə məlumat ötürə bilər. Bu, boru xətti emalını təşkil etməyə imkan verir: birinci qəbuledici Intent-i əlavə məlumatlarla zənginləşdirir, ikinci onlardan istifadə edir, üçüncü zənciri tamamlayır. getResultExtras metodu əvvəlki qəbuledici tərəfindən ötürülən məlumatları oxuyur.
Normal Broadcast üçün sıra təmin edilmir, ona görə bütün qəbuledicilər orijinal Intent-i dəyişiklik olmadan alır. Qəbuledicilərin bir-birinə təsir etməsi lazımdırsa, sendBroadcast əvəzinə sendOrderedBroadcast istifadə edin.
Android 8 (API 26, Oreo) fon Broadcast-ləri ilə bağlı əhəmiyyətli məhdudiyyətlər tətbiq etdi. Gizli (implicit) Broadcast-lərin əksəriyyəti — konkret proqrama ünvanlanmayanlar — statik qeydiyyatla artıq işləmir. Sistem CONNECTIVITY_ACTION və ya ACTION_BATTERY_LOW kimi aksiyalar üçün manifestdə qeydiyyatdan keçmiş qəbulediciləri bloklayır.
Google statik qeydiyyatla işləməyə davam edən Broadcast-lərin siyahısını müəyyən etdi: BOOT_COMPLETED, TIME_TICK, Alarm, INSTANCE? (paket dəyişiklikləri) — cəmi onlarla istisna. Qalan bütün gizli Broadcast-lər indi yalnız proqram ön planda olduqda işləyən Context.registerReceiver vasitəsilə dinamik qeydiyyat tələb edir.
Əvvəllər Broadcast Receiver vasitəsilə həll edilən fon tapşırıqları üçün Android WorkManager (icra zəmanəti ilə gecikdirilmiş tapşırıqlar), JobScheduler (cihazın vəziyyəti nəzərə alınmaqla dövri tapşırıqlar) və NotificationListenerService (bildirişlərin monitorinqi) tövsiyə edir. Bu komponentlər Android 8 məhdudiyyətləri olmadan işləyir və enerji istehlakı üçün optimallaşdırılıb.
Şəbəkə qoşulmasını izləmək üçün Broadcast Receiver yaradılmasını nəzərdən keçirək. Qəbuledici CONNECTIVITY_ACTION Broadcast-ni alacaq və qoşulma növünü qeyd edəcək. Android 8+ üçün onu dinamik qeydiyyatdan keçirəcəyik, çünki bu, statik qeydiyyatdan çıxarılmış gizli Broadcast-dir.
// Şəbəkə vəziyyətini izləmək üçün 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", "Qoşulma növü: $connectionType")
}
}
// Activity-də dinamik qeydiyyat
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)
}
}
Qəbuledicinin qeydiyyatını mütləq onStop-da ləğv edin — əgər Activity arxa plana keçərsə, lakin qəbuledici qeydiyyatda qalarsa, sistem resursları boşalda bilməz. Service üçün onDestroy istifadə edin. Fragmentlərdə qəbuledicini onStart-da qeydiyyatdan keçirin və onStop-da ləğv edin, fragmentin həyat dövrünə uyğun olaraq.
Tez-tez verilən suallar
Broadcast Receiver — sistem və istifadəçi Broadcast mesajlarını emal etmək üçün Android komponentidir. O, Intent-i onReceive metodunda alır, bu metod əsas axında icra olunur və 10 saniyə ərzində bitməlidir. Uzun müddətli tapşırıqlar üçün WorkManager və ya JobScheduler istifadə edin.
Normal Broadcast bütün qəbuledicilərə asinxron və paralel çatdırılır — sıra təmin edilmir, abortBroadcast işləmir. Ordered Broadcast prioritetə görə ardıcıl ötürülür, hər bir qəbuledici zənciri kəsə və ya setResultExtras vasitəsilə məlumat ötürə bilər.
Statik qeydiyyat (manifestdə) qəbulediciyə proqram işə salınmamış olsa belə işləməyə imkan verir. Dinamik (registerReceiver vasitəsilə) yalnız qeydiyyatdan keçirən komponent aktiv olduqda işləyir. Android 8-dən etibarən bir çox gizli Broadcast dinamik qeydiyyat tələb edir.
Android 8 (API 26) CONNECTIVITY_ACTION və ya ACTION_BATTERY_LOW kimi gizli Broadcast-lərin əksəriyyəti üçün statik qeydiyyatı qadağan etdi. İstisnalara BOOT_COMPLETED, Alarm, vaxt və bəzi digərləri daxildir. Fon tapşırıqları üçün Broadcast əvəzinə WorkManager istifadə edin.
onReceive-dən UI-ə məlumat ötürmək üçün LiveData, StateFlow, EventBus və ya LocalBroadcastManager istifadə edin. Birbaşa onReceive-dən UI-i yeniləməyə çalışmayın — o, əsas axında icra olunur, lakin qəbuledici Activity-nin görünməsini təmin etmir. LocalBroadcastManager daxili kommunikasiya üçün köhnəlmiş seçimdir.
Xülasə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun