Ang Broadcast Receiver ay isang bahagi ng Android na nakikinig at nagpoproseso ng mga system Broadcast message, tulad ng pagbabago ng status ng network, antas ng baterya, pagtanggap ng SMS, o pag-install ng app. Ito ay inilulunsad ng operating system kapag may nangyaring event at nagsasagawa ng gawain sa main thread o sa pamamagitan ng background service. Ayon sa Android Developer Guide, 2026, ang Broadcast Receiver ay nagpapahintulot sa app na tumugon sa mga global system event, kahit na hindi ito tumatakbo, na ginagawa itong pangunahing mekanismo para sa background processing ng mga event sa Android ecosystem.
Mga Pangunahing Punto
Broadcast Receiver — ay isang bahagi ng Android na idinisenyo para sa pagtanggap at pagproseso ng mga Intent message na ipinapalaganap ng operating system o iba pang apps. Hindi tulad ng Activity at Service, ang Broadcast Receiver ay walang user interface — ang gawain nito ay magsagawa ng maikling gawain kapag may nangyaring event.
Ang Broadcast Receiver ay gumagana sa pamamagitan ng mekanismong Intent. Ang system o app ay nagpapadala ng Intent sa pamamagitan ng sendBroadcast o sendOrderedBroadcast, at ang operating system ay naghahatid nito sa mga rehistradong receiver. Bawat receiver ay tumatanggap ng Intent sa onReceive method, na isinasagawa sa main thread.
Ayon sa Android Compatibility Definition Document, ang Broadcast Receiver ay dapat kumpletuhin ang onReceive sa loob ng 10 segundo — kung hindi, ituturing ito ng system na frozen at tatapusin ang proseso. Para sa mahabang background task, gamitin ang JobScheduler o WorkManager na inilunsad mula sa receiver.
Ang Android ay sumusuporta sa dalawang pangunahing uri ng Broadcast: Normal Broadcast at Ordered Broadcast. Ang pagkakaiba ay nasa pagkakasunod-sunod ng paghahatid at posibilidad na ihinto ang processing chain. Bukod dito, ang Broadcast ay nahahati sa system (ginawa ng OS) at user (ginawa ng app).
Ang Normal Broadcast ay inihatid sa lahat ng rehistradong receiver nang asynchronous at walang garantisadong pagkakasunod-sunod. Maaaring iproseso ng system ang mga ganitong Broadcast nang parallel — bawat receiver ay tumatanggap ng Intent sa sarili nitong thread. Ang pagtawag ng abortBroadcast sa Normal Broadcast ay walang epekto: hindi maaaring kanselahin ang paghahatid sa ibang receiver.
Ang Ordered Broadcast ay inihatid nang sunud-sunod — bawat receiver sa pababang pagkakasunod-sunod ng attribute na android:priority (mula 0 hanggang 999). Pagkatapos ng pagproseso, ang receiver ay maaaring magpasa ng resulta sa susunod sa pamamagitan ng setResultExtras o ihinto ang chain sa pamamagitan ng pagtawag ng abortBroadcast. Ito ay ginagamit sa mga scenario kung saan mahalaga ang pagkakasunod-sunod ng pagproseso — halimbawa, mga SMS receiver.
Ang Android ay gumagawa ng maraming System Broadcast: ACTION_BOOT_COMPLETED (pag-boot ng device), ACTION_BATTERY_LOW, ACTION_POWER_CONNECTED, CONNECTIVITY_ACTION, ACTION_PACKAGE_ADDED at iba pa. Bawat Intent ay naglalaman ng karagdagang data sa Extras — antas ng baterya, uri ng koneksyon, pangalan ng package.
| Uri ng Broadcast | Pagkakasunod-sunod | abortBroadcast | Pagganap |
|---|---|---|---|
| Normal | Hindi garantisado | Hindi gumagana | Mataas (parallel) |
| Ordered | Batay sa priyoridad | Gumagana | Katamtaman (sunud-sunod) |
| Sticky | Isang halaga | Hindi naaangkop | Mababa (luma na mula API 21) |
Sticky Broadcast — isang lumang uri na nag-iimbak ng huling ipinadalang halaga. Sa halip, gamitin ang LiveData, StateFlow, o shared SharedPreferences para sa pag-imbak ng huling estado.
Ang Broadcast Receiver ay maaaring irehistro sa dalawang paraan: static sa pamamagitan ng AndroidManifest.xml o dynamic sa code sa pamamagitan ng registerReceiver. Ang pagpili ay depende sa scenario: ang static na pagpaparehistro ay gumagana kahit hindi tumatakbo ang app, dynamic — habang ang nagrerehistrong component ay aktibo.
Ang static na pagpaparehistro ay idineklara sa manifest gamit ang tag na <receiver> sa loob ng <application>. Para sa bawat receiver, tinutukoy ang handler class at Intent filter na may mga aksyon na dapat nitong maharang. Niloload ng system ang mga ganitong receiver kapag may nangyaring Broadcast kahit hindi tumatakbo ang app.
<!-- 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>
Ang dynamic na pagpaparehistro ay ginagawa sa pamamagitan ng method na registerReceiver sa code ng Activity, Service, o Fragment. Ang receiver ay nabubuhay lamang hangga't nabubuhay ang component na nagrehistro dito. Kailangang tumawag ng unregisterReceiver sa onPause o onDestroy — kung hindi, magkakaroon ng memory leak, at maaaring tapusin ng system ang proseso.
Para sa Ordered Broadcast, ang pagkakasunod-sunod ng paghahatid ay tinutukoy ng attribute na android:priority. Ang receiver na may mas mataas na priyoridad ay tumatanggap ng Intent nang mas maaga. Kung pagkatapos ng pagproseso ay tumawag ito ng abortBroadcast, ang mga receiver na may mas mababang priyoridad ay hindi makakatanggap ng Intent. Para sa static na receiver, ang priyoridad ay nakatakda sa Intent filter ng manifest.
Ang mga receiver sa Ordered Broadcast ay maaaring maglipat ng data sa susunod sa chain sa pamamagitan ng setResultExtras o setResultData. Ito ay nagbibigay-daan sa pipeline processing: ang unang receiver ay nagpapayaman ng Intent ng karagdagang data, ang pangalawa ay gumagamit ng mga ito, ang pangatlo ay kumukumpleto ng chain. Ang method na getResultExtras ay nagbabasa ng data na inilipat ng nakaraang receiver.
Para sa Normal Broadcast, hindi garantisado ang pagkakasunod-sunod, kaya lahat ng receiver ay tumatanggap ng orihinal na Intent nang walang pagbabago. Kung kailangan mong mag-impluwensyahan ang mga receiver sa isa't isa, gamitin ang sendOrderedBroadcast sa halip na sendBroadcast.
Ang Android 8 (API 26, Oreo) ay nagpakilala ng makabuluhang mga limitasyon sa background Broadcast. Karamihan sa mga implicit Broadcast — yaong hindi nakatutok sa isang partikular na app — ay hindi na gumagana sa static na pagpaparehistro. Hinaharangan ng system ang mga receiver na naka-rehistro sa manifest para sa mga aksyon tulad ng CONNECTIVITY_ACTION o ACTION_BATTERY_LOW.
Itinakda ng Google ang listahan ng mga Broadcast na patuloy na gumagana sa static na pagpaparehistro: BOOT_COMPLETED, TIME_TICK, Alarm, INSTANCE? (mga pagbabago sa package) — mga sampung exception sa kabuuan. Ang lahat ng iba pang implicit Broadcast ay nangangailangan na ngayon ng dynamic na pagpaparehistro sa pamamagitan ng Context.registerReceiver, na gumagana lamang kapag ang app ay nasa foreground.
Para sa mga background task na dati nang nalutas sa pamamagitan ng Broadcast Receiver, inirerekomenda ng Android ang WorkManager (mga delay na task na may garantiya ng pagpapatupad), JobScheduler (mga periodic task na isinasaalang-alang ang status ng device), at NotificationListenerService (pag-monitor ng notifications). Ang mga component na ito ay gumagana nang walang mga limitasyon ng Android 8 at na-optimize para sa konsumo ng kuryente.
Isaalang-alang natin ang paggawa ng Broadcast Receiver para sa pagsubaybay ng koneksyon sa network. Ang receiver ay tatanggap ng Broadcast CONNECTIVITY_ACTION at magla-log ng uri ng koneksyon. Para sa Android 8+, irerehistro namin ito nang dynamic, dahil ito ay isang implicit Broadcast na hindi kasama sa static na pagpaparehistro.
// Broadcast Receiver para sa pagsubaybay ng status ng network
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", "Uri ng koneksyon: $connectionType")
}
}
// Dynamic na pagpaparehistro sa Activity
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)
}
}
Kailangang kanselahin ang pagpaparehistro ng receiver sa onStop — kung ang Activity ay pumunta sa background ngunit ang receiver ay nananatiling naka-rehistro, hindi mailalabas ng system ang mga resources. Para sa Service, gamitin ang onDestroy. Sa fragments, irehistro ang receiver sa onStart at kanselahin sa onStop, ayon sa lifecycle ng fragment.
Mga Madalas Itanong
Broadcast Receiver — bahagi ng Android para sa pagproseso ng system at user Broadcast message. Ito ay tumatanggap ng Intent sa onReceive method, na isinasagawa sa main thread at dapat kumpletuhin sa loob ng 10 segundo. Para sa mahabang task, gamitin ang WorkManager o JobScheduler.
Normal Broadcast ay inihatid sa lahat ng receiver nang asynchronous at parallel — hindi garantisado ang pagkakasunod-sunod, hindi gumagana ang abortBroadcast. Ang Ordered Broadcast ay ipinapadala nang sunud-sunod batay sa priyoridad, bawat receiver ay maaaring huminto sa chain o maglipat ng data sa pamamagitan ng setResultExtras.
Static na pagpaparehistro (sa manifest) ay nagpapahintulot sa receiver na gumana kahit hindi tumatakbo ang app. Dynamic (sa pamamagitan ng registerReceiver) ay gumagana lamang habang ang nagrerehistrong component ay aktibo. Mula noong Android 8, maraming implicit Broadcast ang nangangailangan ng dynamic na pagpaparehistro.
Ang Android 8 (API 26) ay nagbawal ng static na pagpaparehistro para sa karamihan ng implicit Broadcast, tulad ng CONNECTIVITY_ACTION o ACTION_BATTERY_LOW. Kasama sa mga exception ang BOOT_COMPLETED, Alarm, oras, at ilang iba pa. Para sa background task, gamitin ang WorkManager sa halip na Broadcast.
Gamitin ang LiveData, StateFlow, EventBus, o LocalBroadcastManager para maglipat ng data mula onReceive papunta sa UI. Huwag subukang i-update ang UI nang direkta mula sa onReceive — ito ay isinasagawa sa main thread, ngunit hindi ginagarantiya ng receiver na nakikita ang Activity. Ang LocalBroadcastManager ay isang lumang opsyon para sa internal na komunikasyon.
Buod
Gagawa kami ng mobile application na turnkey
Gumagawa ang IT Sectr ng mga iOS at Android application para sa mga startup at negosyo mula noong 2017. Magpapayo kami sa iyo at magmumungkahi ng pinakamahusay na solusyon.
Basahin din