Το Broadcast Receiver είναι ένα στοιχείο του Android που ακούει και επεξεργάζεται συστημικά μηνύματα Broadcast, όπως η αλλαγή κατάστασης δικτύου, το επίπεδο φόρτισης μπαταρίας, η λήψη SMS ή η εγκατάσταση εφαρμογής. Εκκινείται από το λειτουργικό σύστημα όταν συμβεί ένα συμβάν και εκτελεί την εργασία στο κύριο νήμα ή μέσω μιας υπηρεσίας παρασκηνίου. Σύμφωνα με τον Android Developer Guide, 2026, το Broadcast Receiver επιτρέπει στην εφαρμογή να αντιδρά σε παγκόσμια συστημικά συμβάντα, ακόμα κι αν δεν εκτελείται, καθιστώντας το βασικό μηχανισμό για την επεξεργασία συμβάντων παρασκηνίου στο οικοσύστημα Android.
Βασικά σημεία
Το Broadcast Receiver είναι ένα στοιχείο του Android σχεδιασμένο για τη λήψη και επεξεργασία μηνυμάτων Intent που διαδίδονται από το λειτουργικό σύστημα ή άλλες εφαρμογές. Σε αντίθεση με το Activity και το Service, το Broadcast Receiver δεν έχει διεπαφή χρήστη — ο σκοπός του είναι να εκτελέσει μια σύντομη εργασία όταν συμβεί ένα συμβάν.
Το Broadcast Receiver λειτουργεί μέσω του μηχανισμού Intent. Το σύστημα ή η εφαρμογή στέλνει ένα Intent μέσω sendBroadcast ή sendOrderedBroadcast, και το λειτουργικό σύστημα το παραδίδει στους εγγεγραμμένους δέκτες. Κάθε δέκτης λαμβάνει το Intent στη μέθοδο onReceive, η οποία εκτελείται στο κύριο νήμα.
Σύμφωνα με το Android Compatibility Definition Document, το Broadcast Receiver πρέπει να ολοκληρώσει το onReceive εντός 10 δευτερολέπτων — διαφορετικά το σύστημα το θεωρεί παγωμένο και τερματίζει τη διαδικασία. Για μακροχρόνιες εργασίες παρασκηνίου, χρησιμοποιήστε το JobScheduler ή το WorkManager, που εκκινούνται από τον δέκτη.
Το Android υποστηρίζει δύο κύριους τύπους Broadcast: Normal Broadcast και Ordered Broadcast. Η διαφορά έγκειται στη σειρά παράδοσης και στη δυνατότητα διακοπής της αλυσίδας επεξεργασίας. Επιπλέον, τα Broadcast χωρίζονται σε συστημικά (που παράγονται από το OS) και χρηστικά (που δημιουργούνται από την εφαρμογή).
Το Normal Broadcast παραδίδεται σε όλους τους εγγεγραμμένους δέκτες ασύγχρονα και χωρίς εγγυημένη σειρά. Το σύστημα μπορεί να επεξεργάζεται τέτοια Broadcast παράλληλα — κάθε δέκτης λαμβάνει το Intent στο δικό του νήμα. Η κλήση abortBroadcast σε Normal Broadcast δεν έχει αποτέλεσμα: η παράδοση σε άλλους δέκτες δεν μπορεί να ακυρωθεί.
Το Ordered Broadcast παραδίδεται σειριακά — σε κάθε δέκτη με φθίνουσα σειρά του χαρακτηριστικού android:priority (από 0 έως 999). Μετά την επεξεργασία, ο δέκτης μπορεί να μεταδώσει το αποτέλεσμα στον επόμενο μέσω setResultExtras ή να διακόψει την αλυσίδα καλώντας το abortBroadcast. Αυτό χρησιμοποιείται σε σενάρια όπου η σειρά επεξεργασίας είναι σημαντική — για παράδειγμα, δέκτες SMS.
Το Android παράγει πολλά συστημικά Broadcast: ACTION_BOOT_COMPLETED (εκκίνηση συσκευής), ACTION_BATTERY_LOW, ACTION_POWER_CONNECTED, CONNECTIVITY_ACTION, ACTION_PACKAGE_ADDED και άλλα. Κάθε Intent περιέχει επιπλέον δεδομένα στο Extras — επίπεδο μπαταρίας, τύπο σύνδεσης, όνομα πακέτου.
| Τύπος Broadcast | Σειρά | abortBroadcast | Απόδοση |
|---|---|---|---|
| Normal | Δεν είναι εγγυημένη | Δεν λειτουργεί | Υψηλή (παράλληλη) |
| Ordered | Βάσει προτεραιότητας | Λειτουργεί | Μέτρια (σειριακή) |
| Sticky | Μία τιμή | Δεν εφαρμόζεται | Χαμηλή (παρωχημένο από API 21) |
Sticky Broadcast — ένας παρωχημένος τύπος που αποθηκεύει την τελευταία σταλμένη τιμή. Αντί αυτού, χρησιμοποιήστε LiveData, StateFlow ή κοινόχρηστα SharedPreferences για την αποθήκευση της τελευταίας κατάστασης.
Το Broadcast Receiver μπορεί να εγγραφεί με δύο τρόπους: στατικά μέσω AndroidManifest.xml ή δυναμικά στον κώδικα μέσω registerReceiver. Η επιλογή εξαρτάται από το σενάριο: η στατική εγγραφή λειτουργεί ακόμα κι αν η εφαρμογή δεν εκτελείται, η δυναμική — μόνο όσο το στοιχείο εγγραφής είναι ενεργό.
Η στατική εγγραφή δηλώνεται στο manifest με την ετικέτα <receiver> μέσα στο <application>. Για κάθε δέκτη καθορίζεται η κλάση χειρισμού και το φίλτρο Intent με τις ενέργειες που πρέπει να αναχαιτίζει. Το σύστημα φορτώνει τέτοιους δέκτες όταν συμβεί ένα Broadcast, ακόμα κι αν η εφαρμογή δεν εκτελείται.
<!-- 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>
Η δυναμική εγγραφή πραγματοποιείται με τη μέθοδο registerReceiver στον κώδικα του Activity, Service ή Fragment. Ο δέκτης ζει μόνο όσο ζει το στοιχείο που τον εγγράφηκε. Είναι υποχρεωτικό να καλέσετε το unregisterReceiver στο onPause ή onDestroy — διαφορετικά θα προκύψει διαρροή μνήμης και το σύστημα μπορεί να τερματίσει τη διαδικασία.
Για το Ordered Broadcast, η σειρά παράδοσης καθορίζεται από το χαρακτηριστικό android:priority. Ο δέκτης με υψηλότερη προτεραιότητα λαμβάνει το Intent νωρίτερα. Αν μετά την επεξεργασία καλέσει το abortBroadcast, οι δέκτες με χαμηλότερη προτεραιότητα δεν θα λάβουν το Intent. Για στατικούς δέκτες, η προτεραιότητα ορίζεται στο φίλτρο Intent του manifest.
Οι δέκτες σε Ordered Broadcast μπορούν να μεταφέρουν δεδομένα στον επόμενο της αλυσίδας μέσω setResultExtras ή setResultData. Αυτό επιτρέπει την οργάνωση επεξεργασίας σωλήνωσης: ο πρώτος δέκτης εμπλουτίζει το Intent με επιπλέον δεδομένα, ο δεύτερος τα χρησιμοποιεί, ο τρίτος ολοκληρώνει την αλυσίδα. Η μέθοδος getResultExtras διαβάζει τα δεδομένα που μεταφέρθηκαν από τον προηγούμενο δέκτη.
Για το Normal Broadcast, η σειρά δεν είναι εγγυημένη, οπότε όλοι οι δέκτες λαμβάνουν το αρχικό Intent χωρίς αλλαγές. Αν χρειάζεστε οι δέκτες να επηρεάζουν ο ένας τον άλλον, χρησιμοποιήστε sendOrderedBroadcast αντί για sendBroadcast.
Το Android 8 (API 26, Oreo) εισήγαγε σημαντικούς περιορισμούς στα Broadcast παρασκηνίου. Τα περισσότερα σιωπηρά (implicit) Broadcast — αυτά που δεν απευθύνονται σε συγκεκριμένη εφαρμογή — δεν λειτουργούν πλέον με στατική εγγραφή. Το σύστημα μπλοκάρει τους δέκτες που είναι εγγεγραμμένοι στο manifest για ενέργειες όπως CONNECTIVITY_ACTION ή ACTION_BATTERY_LOW.
Η Google καθόρισε μια λίστα Broadcast που συνεχίζουν να λειτουργούν με στατική εγγραφή: BOOT_COMPLETED, TIME_TICK, Alarm, INSTANCE? (αλλαγές πακέτου) — συνολικά περίπου δέκα εξαιρέσεις. Όλα τα άλλα σιωπηρά Broadcast απαιτούν πλέον δυναμική εγγραφή μέσω Context.registerReceiver, η οποία λειτουργεί μόνο όταν η εφαρμογή βρίσκεται στο προσκήνιο.
Για εργασίες παρασκηνίου που προηγουμένως επιλύονταν μέσω Broadcast Receiver, το Android συνιστά WorkManager (καθυστερημένες εργασίες με εγγύηση εκτέλεσης), JobScheduler (περιοδικές εργασίες λαμβάνοντας υπόψη την κατάσταση της συσκευής) και NotificationListenerService (παρακολούθηση ειδοποιήσεων). Αυτά τα στοιχεία λειτουργούν χωρίς τους περιορισμούς του Android 8 και είναι βελτιστοποιημένα για κατανάλωση ενέργειας.
Ας εξετάσουμε τη δημιουργία ενός Broadcast Receiver για την παρακολούθηση της σύνδεσης δικτύου. Ο δέκτης θα λαμβάνει το Broadcast CONNECTIVITY_ACTION και θα καταγράφει τον τύπο σύνδεσης. Για Android 8+, θα τον εγγράψουμε δυναμικά, καθώς πρόκειται για σιωπηρό Broadcast που εξαιρείται από τη στατική εγγραφή.
// 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", "Τύπος σύνδεσης: $connectionType")
}
}
// Δυναμική εγγραφή σε 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)
}
}
Ακυρώστε υποχρεωτικά την εγγραφή του δέκτη στο onStop — αν το Activity πάει στο παρασκήνιο αλλά ο δέκτης παραμείνει εγγεγραμμένος, το σύστημα δεν θα μπορεί να ελευθερώσει πόρους. Για Service, χρησιμοποιήστε το onDestroy. Σε fragments, εγγράψτε τον δέκτη στο onStart και ακυρώστε στο onStop, ακολουθώντας τον κύκλο ζωής του fragment.
Συχνές Ερωτήσεις
Το Broadcast Receiver είναι ένα στοιχείο Android για την επεξεργασία συστημικών και χρηστικών μηνυμάτων Broadcast. Λαμβάνει το Intent στη μέθοδο onReceive, η οποία εκτελείται στο κύριο νήμα και πρέπει να ολοκληρωθεί εντός 10 δευτερολέπτων. Για μακροχρόνιες εργασίες, χρησιμοποιήστε WorkManager ή JobScheduler.
Το Normal Broadcast παραδίδεται σε όλους τους δέκτες ασύγχρονα και παράλληλα — η σειρά δεν είναι εγγυημένη, το abortBroadcast δεν λειτουργεί. Το Ordered Broadcast μεταδίδεται σειριακά βάσει προτεραιότητας, κάθε δέκτης μπορεί να διακόψει την αλυσίδα ή να μεταφέρει δεδομένα μέσω setResultExtras.
Η στατική εγγραφή (στο manifest) επιτρέπει στον δέκτη να λειτουργεί ακόμα κι αν η εφαρμογή δεν εκτελείται. Η δυναμική (μέσω registerReceiver) λειτουργεί μόνο όσο το στοιχείο εγγραφής είναι ενεργό. Από το Android 8, πολλά σιωπηρά Broadcast απαιτούν δυναμική εγγραφή.
Το Android 8 (API 26) απαγόρευσε τη στατική εγγραφή για τα περισσότερα σιωπηρά Broadcast, όπως CONNECTIVITY_ACTION ή ACTION_BATTERY_LOW. Οι εξαιρέσεις περιλαμβάνουν BOOT_COMPLETED, Alarm, χρόνο και μερικά άλλα. Για εργασίες παρασκηνίου, χρησιμοποιήστε WorkManager αντί για Broadcast.
Χρησιμοποιήστε LiveData, StateFlow, EventBus ή LocalBroadcastManager για τη μεταφορά δεδομένων από το onReceive στο UI. Μην επιχειρήσετε να ενημερώσετε το UI απευθείας από το onReceive — εκτελείται στο κύριο νήμα, αλλά ο δέκτης δεν εγγυάται ότι το Activity είναι ορατό. Το LocalBroadcastManager είναι μια παρωχημένη επιλογή για εσωτερική επικοινωνία.
Σύνοψη
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης