Broadcast Receiver: τι είναι, τύποι Broadcast και αρχή λειτουργίας

Συγγραφέας: IT Sectr Δημοσιεύτηκε: 2026-06-17 Χρόνος ανάγνωσης: 7 λεπ

Το Broadcast Receiver είναι ένα στοιχείο του Android που ακούει και επεξεργάζεται συστημικά μηνύματα Broadcast, όπως η αλλαγή κατάστασης δικτύου, το επίπεδο φόρτισης μπαταρίας, η λήψη SMS ή η εγκατάσταση εφαρμογής. Εκκινείται από το λειτουργικό σύστημα όταν συμβεί ένα συμβάν και εκτελεί την εργασία στο κύριο νήμα ή μέσω μιας υπηρεσίας παρασκηνίου. Σύμφωνα με τον Android Developer Guide, 2026, το Broadcast Receiver επιτρέπει στην εφαρμογή να αντιδρά σε παγκόσμια συστημικά συμβάντα, ακόμα κι αν δεν εκτελείται, καθιστώντας το βασικό μηχανισμό για την επεξεργασία συμβάντων παρασκηνίου στο οικοσύστημα Android.

Βασικά σημεία

  • Broadcast Receiver — στοιχείο Android για ασύγχρονη επεξεργασία συστημικών και χρηστικών μηνυμάτων Broadcast.
  • Ordered Broadcast μεταδίδεται σειριακά βάσει προτεραιότητας και μπορεί να διακοπεί από οποιονδήποτε δέκτη.
  • Normal Broadcast παραδίδεται σε όλους τους συνδρομητές ταυτόχρονα — η σειρά επεξεργασίας δεν είναι εγγυημένη.
  • Εγγραφή μπορεί να είναι στατική (στο manifest) και δυναμική (στον κώδικα μέσω registerReceiver).
  • Περιορισμοί Το Android 8+ απαγορεύει τη στατική εγγραφή για πολλά σιωπηρά Broadcast, μειώνοντας το φορτίο παρασκηνίου.

Τι είναι το Broadcast Receiver;

Το 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, που εκκινούνται από τον δέκτη.

Τύποι Broadcast στο Android

Το Android υποστηρίζει δύο κύριους τύπους Broadcast: Normal Broadcast και Ordered Broadcast. Η διαφορά έγκειται στη σειρά παράδοσης και στη δυνατότητα διακοπής της αλυσίδας επεξεργασίας. Επιπλέον, τα Broadcast χωρίζονται σε συστημικά (που παράγονται από το OS) και χρηστικά (που δημιουργούνται από την εφαρμογή).

Normal Broadcast

Το Normal Broadcast παραδίδεται σε όλους τους εγγεγραμμένους δέκτες ασύγχρονα και χωρίς εγγυημένη σειρά. Το σύστημα μπορεί να επεξεργάζεται τέτοια Broadcast παράλληλα — κάθε δέκτης λαμβάνει το Intent στο δικό του νήμα. Η κλήση abortBroadcast σε Normal Broadcast δεν έχει αποτέλεσμα: η παράδοση σε άλλους δέκτες δεν μπορεί να ακυρωθεί.

Ordered Broadcast

Το Ordered Broadcast παραδίδεται σειριακά — σε κάθε δέκτη με φθίνουσα σειρά του χαρακτηριστικού android:priority (από 0 έως 999). Μετά την επεξεργασία, ο δέκτης μπορεί να μεταδώσει το αποτέλεσμα στον επόμενο μέσω setResultExtras ή να διακόψει την αλυσίδα καλώντας το abortBroadcast. Αυτό χρησιμοποιείται σε σενάρια όπου η σειρά επεξεργασίας είναι σημαντική — για παράδειγμα, δέκτες SMS.

Συστημικά Broadcast

Το 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

Το Broadcast Receiver μπορεί να εγγραφεί με δύο τρόπους: στατικά μέσω AndroidManifest.xml ή δυναμικά στον κώδικα μέσω registerReceiver. Η επιλογή εξαρτάται από το σενάριο: η στατική εγγραφή λειτουργεί ακόμα κι αν η εφαρμογή δεν εκτελείται, η δυναμική — μόνο όσο το στοιχείο εγγραφής είναι ενεργό.

Στατική εγγραφή

Η στατική εγγραφή δηλώνεται στο manifest με την ετικέτα <receiver> μέσα στο <application>. Για κάθε δέκτη καθορίζεται η κλάση χειρισμού και το φίλτρο Intent με τις ενέργειες που πρέπει να αναχαιτίζει. Το σύστημα φορτώνει τέτοιους δέκτες όταν συμβεί ένα Broadcast, ακόμα κι αν η εφαρμογή δεν εκτελείται.

xml
<!-- 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 και νεότερο

Το 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

Για εργασίες παρασκηνίου που προηγουμένως επιλύονταν μέσω Broadcast Receiver, το Android συνιστά WorkManager (καθυστερημένες εργασίες με εγγύηση εκτέλεσης), JobScheduler (περιοδικές εργασίες λαμβάνοντας υπόψη την κατάσταση της συσκευής) και NotificationListenerService (παρακολούθηση ειδοποιήσεων). Αυτά τα στοιχεία λειτουργούν χωρίς τους περιορισμούς του Android 8 και είναι βελτιστοποιημένα για κατανάλωση ενέργειας.

Παράδειγμα Broadcast Receiver σε Kotlin

Ας εξετάσουμε τη δημιουργία ενός Broadcast Receiver για την παρακολούθηση της σύνδεσης δικτύου. Ο δέκτης θα λαμβάνει το Broadcast CONNECTIVITY_ACTION και θα καταγράφει τον τύπο σύνδεσης. Για Android 8+, θα τον εγγράψουμε δυναμικά, καθώς πρόκειται για σιωπηρό Broadcast που εξαιρείται από τη στατική εγγραφή.

kotlin
// 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 Receiver είναι ένα στοιχείο Android για την επεξεργασία συστημικών και χρηστικών μηνυμάτων Broadcast. Λαμβάνει το Intent στη μέθοδο onReceive, η οποία εκτελείται στο κύριο νήμα και πρέπει να ολοκληρωθεί εντός 10 δευτερολέπτων. Για μακροχρόνιες εργασίες, χρησιμοποιήστε WorkManager ή JobScheduler.

Ποια είναι η διαφορά μεταξύ Normal Broadcast και Ordered Broadcast;

Το Normal Broadcast παραδίδεται σε όλους τους δέκτες ασύγχρονα και παράλληλα — η σειρά δεν είναι εγγυημένη, το abortBroadcast δεν λειτουργεί. Το Ordered Broadcast μεταδίδεται σειριακά βάσει προτεραιότητας, κάθε δέκτης μπορεί να διακόψει την αλυσίδα ή να μεταφέρει δεδομένα μέσω setResultExtras.

Ποια είναι η διαφορά μεταξύ στατικής και δυναμικής εγγραφής;

Η στατική εγγραφή (στο manifest) επιτρέπει στον δέκτη να λειτουργεί ακόμα κι αν η εφαρμογή δεν εκτελείται. Η δυναμική (μέσω registerReceiver) λειτουργεί μόνο όσο το στοιχείο εγγραφής είναι ενεργό. Από το Android 8, πολλά σιωπηρά Broadcast απαιτούν δυναμική εγγραφή.

Ποιοι περιορισμοί εμφανίστηκαν στο Android 8 για το Broadcast Receiver;

Το Android 8 (API 26) απαγόρευσε τη στατική εγγραφή για τα περισσότερα σιωπηρά Broadcast, όπως CONNECTIVITY_ACTION ή ACTION_BATTERY_LOW. Οι εξαιρέσεις περιλαμβάνουν BOOT_COMPLETED, Alarm, χρόνο και μερικά άλλα. Για εργασίες παρασκηνίου, χρησιμοποιήστε WorkManager αντί για Broadcast.

Πώς να μεταφέρω δεδομένα από το Broadcast Receiver στο Activity;

Χρησιμοποιήστε LiveData, StateFlow, EventBus ή LocalBroadcastManager για τη μεταφορά δεδομένων από το onReceive στο UI. Μην επιχειρήσετε να ενημερώσετε το UI απευθείας από το onReceive — εκτελείται στο κύριο νήμα, αλλά ο δέκτης δεν εγγυάται ότι το Activity είναι ορατό. Το LocalBroadcastManager είναι μια παρωχημένη επιλογή για εσωτερική επικοινωνία.

Σύνοψη

  • Το Broadcast Receiver είναι ένα στοιχείο συστήματος Android για τη λήψη και επεξεργασία παγκόσμιων συμβάντων μέσω μηνυμάτων Intent από το OS ή άλλες εφαρμογές.
  • Το Normal Broadcast παραδίδεται παράλληλα χωρίς εγγύηση σειράς· το Ordered Broadcast μεταδίδεται σειριακά βάσει προτεραιότητας με δυνατότητα διακοπής της αλυσίδας.
  • Η στατική εγγραφή στο manifest λειτουργεί για διεργασίες που δεν εκτελούνται ακόμα, αλλά είναι περιορισμένη στο Android 8+ για τα περισσότερα σιωπηρά Broadcast.
  • Η δυναμική εγγραφή μέσω registerReceiver απαιτεί υποχρεωτική κλήση unregisterReceiver για την αποφυγή διαρροής μνήμης.
  • Τα συστημικά Broadcast περιλαμβάνουν BOOT_COMPLETED, CONNECTIVITY_ACTION, BATTERY_LOW — το καθένα περιέχει επιπλέον δεδομένα στο Extras του Intent.
  • Ο χρόνος εκτέλεσης του onReceive είναι περιορισμένος στα 10 δευτερόλεπτα — για μακροχρόνιες εργασίες, εκκινήστε WorkManager ή JobScheduler από τον δέκτη.
  • Εναλλακτικές για το Broadcast Receiver στο Android 8+: WorkManager για εργασίες παρασκηνίου, JobScheduler για περιοδικές εργασίες, NotificationListenerService για παρακολούθηση ειδοποιήσεων.

Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση

Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.

Συζήτηση έργου

Διαβάστε επίσης