NetworkCallback: τι είναι, εφαρμογή και διαχείριση δικτύου στο Android

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

NetworkCallback — μια αφηρημένη κλάση στο Android SDK για την παρακολούθηση αλλαγών κατάστασης δικτύου μέσω ConnectivityManager. Σύμφωνα με το Android Developers Documentation (2025), η χρήση του NetworkCallback επιτρέπει στην εφαρμογή να αντιδρά έγκαιρα στη σύνδεση, αποσύνδεση ή αλλαγή χαρακτηριστικών της σύνδεσης. ConnectivityManager.NetworkCallback παρέχει λεπτομερείς πληροφορίες σχετικά με τον τύπο δικτύου, τα captive portals και την απώλεια internet χωρίς συνεχή poll της υπηρεσίας συστήματος.

Κύρια Σημεία

  • NetworkCallback — ενσωματωμένη αφηρημένη κλάση Android SDK για παρακολούθηση κατάστασης δικτύου μέσω ConnectivityManager.
  • Η μέθοδος onAvailable καλείται όταν η συσκευή συνδέεται στο δίκτυο, μεταφέροντας το αντικείμενο Network με λεπτομέρειες σύνδεσης.
  • Η μέθοδος onLost ενεργοποιείται κατά την απώλεια σύνδεσης δικτύου, επιτρέποντας στην εφαρμογή να σταματήσει τα αιτήματα δικτύου.
  • Η μέθοδος onCapabilitiesChanged ειδοποιεί για αλλαγή των δυνατοτήτων δικτύου — εμφάνιση internet, captive portal ή σύνδεση με χρέωση.
  • Καταχώρηση γίνεται μέσω registerNetworkCallback, ακύρωση — μέσω unregisterNetworkCallback στον κύκλο ζωής της εφαρμογής.

Τι είναι το NetworkCallback;

NetworkCallback — είναι μια αφηρημένη κλάση από το πακέτο android.net, που αποτελεί μέρος του Android SDK. Προορίζεται για τη λήψη ειδοποιήσεων σχετικά με αλλαγές στην κατάσταση σύνδεσης δικτύου μέσω της υπηρεσίας συστήματος ConnectivityManager.

Πριν από την εμφάνιση του NetworkCallback, οι προγραμματιστές χρησιμοποιούσαν ραδιοφωνικούς δέκτες BroadcastReceiver για την παρακολούθηση δικτύου. Αυτή η προσέγγιση απαιτούσε συνεχή καταχώρηση στο manifest, λειτουργούσε με καθυστέρηση και δεν παρείχε λεπτομερείς πληροφορίες σχετικά με τα χαρακτηριστικά της σύνδεσης. Android 5.0 (API 21) εισήγαγε το NetworkCallback ως μια πιο ευέλικτη και αποδοτική εναλλακτική.

Το callback λειτουργεί ασύγχρονα: η εφαρμογή εγγράφεται σε συμβάντα μέσω ConnectivityManager και το σύστημα καλεί τις μεθόδους callback όταν αλλάζει η κατάσταση δικτύου. Αυτό εξαλείφει την ανάγκη περιοδικού polling της κατάστασης δικτύου, εξοικονομώντας πόρους μπαταρίας και επεξεργαστή.

Πώς λειτουργεί το callback στο Android

Ο ConnectivityManager διαχειρίζεται όλες τις διεπαφές δικτύου της συσκευής — Wi-Fi, δεδομένα κινητής, Ethernet, VPN. Κατά την αλλαγή οποιασδήποτε από αυτές τις διεπαφές, το σύστημα δημιουργεί ένα αντικείμενο Network και το μεταφέρει στην αντίστοιχη μέθοδο του καταχωρημένου callback. Κάθε Network έχει ένα μοναδικό αναγνωριστικό που αλλάζει κατά την επανασύνδεση.

Το callback δεν είναι δεσμευμένο σε συγκεκριμένο τύπο δικτύου — μπορεί να παρακολουθεί όλες τις διαθέσιμες διεπαφές ταυτόχρονα. Για το φιλτράρισμα τύπων συνδέσεων χρησιμοποιείται η κλάση NetworkRequest, όπου καθορίζονται τα απαιτούμενα πρωτόκολλα μεταφοράς (Wi-Fi, δεδομένα κινητής, Ethernet) και οι δυνατότητες δικτύου.

Πώς να καταχωρήσετε το NetworkCallback στην εφαρμογή

Η καταχώρηση NetworkCallback γίνεται μέσω της μεθόδου ConnectivityManager.registerNetworkCallback. Η πρώτη παράμετρος είναι το NetworkRequest.Builder που περιγράφει τις απαιτήσεις δικτύου, η δεύτερη — μια παρουσία του callback. Για λειτουργία απαιτείται η άδεια ACCESS_NETWORK_STATE στο manifest.

kotlin
class NetworkMonitor(private val context: Context) {

    private val connectivityManager =
        context.getSystemService(Context.CONNECTIVITY_SERVICE)
            as ConnectivityManager

    private val callback =
        object : ConnectivityManager.NetworkCallback() {

        override fun onAvailable(network: Network) {
            Log.d("Network", "Διαθέσιμο: ${network}")
        }

        override fun onLost(network: Network) {
            Log.d("Network", "Χάθηκε: ${network}")
        }
    }

    fun register() {
        connectivityManager.registerNetworkCallback(
            NetworkRequest.Builder().build(), callback
        )
    }

    fun unregister() {
        connectivityManager.unregisterNetworkCallback(callback)
    }
}

Καταχώρηση σε Activity και Fragment

Συνιστάται η καταχώρηση του NetworkCallback όταν η εφαρμογή βρίσκεται στο προσκήνιο και η ακύρωση όταν πηγαίνει στο παρασκήνιο. Στο Activity είναι βολικό να χρησιμοποιείτε onStart και onStop για τη διαχείριση του κύκλου ζωής του callback. Στο Fragment — onResume και onPause.

Για απλοποίηση της διαχείρισης καταχώρησης μπορούν να χρησιμοποιηθούν Lifecycle-aware components. Η βιβλιοθήκη AndroidX Lifecycle επιτρέπει τη δημιουργία προσαρμοσμένου LifecycleObserver που αυτόματα καταχωρεί και ακυρώνει το callback όταν αλλάζει η κατάσταση του κύκλου ζωής.

Καταχώρηση σε υπηρεσία

Για εργασίες παρασκηνίου, η καταχώρηση γίνεται σε Service ή WorkManager. Είναι σημαντικό να λάβετε υπόψη ότι στο Android 8+ οι υπηρεσίες παρασκηνίου έχουν περιορισμούς εκκίνησης. WorkManager με NetworkType — πιο αξιόπιστος τρόπος εκτέλεσης εργασιών σε συγκεκριμένη κατάσταση δικτύου, καθώς είναι ενσωματωμένος με το API συμβατότητας και λαμβάνει υπόψη τη λειτουργία Doze.

Κύριες μέθοδοι του NetworkCallback

Το NetworkCallback παρέχει ένα σύνολο μεθόδων που καλούνται όταν αλλάζει η κατάσταση δικτύου. Δεν είναι υποχρεωτικό να γίνουν override όλες οι μέθοδοι — αρκεί να υλοποιήσετε μόνο αυτές που χρειάζονται για τη συγκεκριμένη εργασία της εφαρμογής. Οι onAvailable και onLost είναι ελάχιστα απαραίτητες για βασική παρακολούθηση σύνδεσης.

ΜέθοδοςΠότε καλείταιΠαράμετροι
onAvailableΤο δίκτυο είναι διαθέσιμο για χρήσηNetwork — αντικείμενο δικτύου
onLostΤο δίκτυο χάθηκε ή αποσυνδέθηκεNetwork — αντικείμενο δικτύου
onCapabilitiesChangedΟι δυνατότητες δικτύου άλλαξανNetwork, NetworkCapabilities
onBlockedStatusChangedΗ κατάσταση αποκλεισμού άλλαξεNetwork, Boolean
onNetworkSuspendedΤο δίκτυο αναστέλλεται από το σύστημαNetwork
onNetworkResumedΤο δίκτυο συνεχίζεται μετά από αναστολήNetwork

Η μέθοδος onCapabilitiesChanged

Αυτή η μέθοδος είναι κλειδί για τη λήψη λεπτομερών πληροφοριών σχετικά με το δίκτυο. Η παράμετρος NetworkCapabilities περιέχει σημαίες: NET_CAPABILITY_INTERNET — πρόσβαση στο internet, NET_CAPABILITY_NOT_METERED — απεριόριστη σύνδεση, NET_CAPABILITY_NOT_ROAMING — χωρίς περιαγωγή. Επίσης μπορείτε να μάθετε την καθυστέρηση σήματος και το εύρος ζώνης.

Τα captive portals — ξεχωριστή περίπτωση: κατά τη σύνδεση σε δημόσιο δίκτυο Wi-Fi μέσω πύλης, η μέθοδος onCapabilitiesChanged δεν εμφανίζει αμέσως INTERNET. Πρώτα το δίκτυο είναι διαθέσιμο, αλλά χωρίς internet — απαιτείται εξουσιοδότηση μέσω προγράμματος περιήγησης. Ο προγραμματιστής πρέπει να λάβει υπόψη αυτή την καθυστέρηση στη λογική της εφαρμογής.

Η μέθοδος onBlockedStatusChanged

Καλείται όταν το σύστημα αποκλείει την κυκλοφορία δικτύου για την εφαρμογή — για παράδειγμα, κατά την ενεργοποίηση λειτουργίας εξοικονόμησης δεδομένων ή περιορισμού δεδομένων παρασκηνίου. onBlockedStatusChanged επιτρέπει στην εφαρμογή να γνωρίζει ότι τα αιτήματά της δικτύου είναι προσωρινά απαγορευμένα και να μεταβεί σε τοπική επεξεργασία.

Παραδείγματα υλοποίησης NetworkCallback

Ας εξετάσουμε την πρακτική υλοποίηση του NetworkCallback για την παρακολούθηση πρόσβασης στο internet και τον χειρισμό captive portals. Στο παρακάτω παράδειγμα φαίνεται ο έλεγχος NET_CAPABILITY_INTERNET και η επικύρωση σύνδεσης μέσω HTTP αιτήματος στον διακομιστή Google.

kotlin
val networkCallback = object : ConnectivityManager.NetworkCallback() {

    override fun onCapabilitiesChanged(
        network: Network,
        caps: NetworkCapabilities
    ) {
        val hasInternet = caps.hasCapability(
            NetworkCapabilities.NET_CAPABILITY_INTERNET
        )
        val isMetered = caps.hasCapability(
            NetworkCapabilities.NET_CAPABILITY_NOT_METERED
        ).not()

        when {
            hasInternet && isMetered ->
                Log.d("Network", "Σύνδεση κινητών δεδομένων")
            hasInternet ->
                Log.d("Network", "Σύνδεση Wi-Fi")
            else ->
                Log.d("Network", "Χωρίς πρόσβαση στο internet")
        }
    }

    override fun onLost(network: Network) {
        Log.d("Network", "Η σύνδεση χάθηκε: ${network}")
        // Διακοπή αιτημάτων δικτύου
    }
}

Χειρισμός captive portals

Κατά τη σύνδεση σε δημόσιο δίκτυο με εξουσιοδότηση (καφετέρια, αεροδρόμιο), το σύστημα πρώτα αναφέρει onAvailable, αλλά η onCapabilitiesChanged μπορεί να μην εμφανίζει INTERNET. Σε τέτοιες περιπτώσεις απαιτείται πρόσθετος έλεγχος μέσω HTTP αιτήματος σε ένα σταθερό endpoint, για παράδειγμα https://www.google.com/generate_204.

Εάν το αίτημα επιστρέφει κωδικό 204 — υπάρχει internet. Εάν ανακατεύθυνση (301, 302, 307) — απαιτείται εξουσιοδότηση μέσω προγράμματος περιήγησης. Σε αυτήν την περίπτωση, μπορείτε να ανοίξετε WebView ή Intent στη διεύθυνση URL ανακατεύθυνσης για έλεγχο ταυτότητας στην πύλη.

kotlin
fun Context.validateInternet(network: Network) {
    CoroutineScope(Dispatchers.IO).launch {
        try {
            val url = URL("https://www.google.com/generate_204")
            val connection =
                network.openConnection(url) as HttpURLConnection
            connection.instanceFollowRedirects = false
            connection.connect()
            when (connection.responseCode) {
                HttpURLConnection.HTTP_NO_CONTENT ->
                    Log.d("Network", "Το internet είναι διαθέσιμο")
                in HttpURLConnection.HTTP_MOVED_PERM
                        ..HttpURLConnection.HTTP_TEMP_REDIRECT ->
                    Log.d("Network", "Εντοπίστηκε captive portal")
            }
            connection.disconnect()
        } catch (e: Exception) {
            Log.e("Network", "Η επικύρωση απέτυχε: ${e.message}")
        }
    }
}

Διαφορές από άλλες μεθόδους παρακολούθησης δικτύου

Πριν από το NetworkCallback, η κύρια μέθοδος παρακολούθησης δικτύου ήταν το BroadcastReceiver με φίλτρο android.net.conn.CONNECTIVITY_CHANGE. Αυτή η προσέγγιση είχε σημαντικά μειονεκτήματα: καθυστέρηση αρκετών δευτερολέπτων, έλλειψη πληροφοριών σχετικά με τον τύπο διεπαφής, αυξημένη κατανάλωση ενέργειας λόγω συνεχούς αφύπνισης της συσκευής.

Σύγχρονη εναλλακτική — LiveData ή StateFlow σε συνδυασμό με NetworkCallback. Το μοτίβο συνίσταται στην περιτύλιξη του callback σε ένα αντιδραστικό ρεύμα που ειδοποιεί αυτόματα το UI για αλλαγή κατάστασης. Για παράδειγμα, το MutableStateFlow με τύπο NetworkStatus ενημερώνεται εντός των μεθόδων callback και το ViewCollector εγγράφεται στις αλλαγές.

ΜέθοδοςAPI LevelΚαθυστέρησηΛεπτομέρειαΚατανάλωση Ενέργειας
BroadcastReceiver1+υψηλήχαμηλήυψηλή
NetworkCallback21+χαμηλήυψηλήχαμηλή
ConnectivityManager.getActiveNetwork23+άμεσημεσαίαμηδενική
NWPathMonitor (iOS)iOS 12+χαμηλήυψηλήχαμηλή

Εργασία σε λειτουργία παρασκηνίου

Από το Android 10, το επίπεδο περιορισμών παρασκηνίου έχει αυστηροποιηθεί και το NetworkCallback μπορεί να μην καλείται όταν η εφαρμογή βρίσκεται στο παρασκήνιο. Για κρίσιμα σημαντικές εργασίες — για παράδειγμα, φόρτωση δεδομένων κατά την εμφάνιση δικτύου — χρησιμοποιήστε WorkManager με περιορισμό NetworkType.CONNECTED. Το WorkManager εγγυάται την εκτέλεση της εργασίας όταν πληρούνται οι συνθήκες δικτύου.

Στο Android 12+ εμφανίστηκε περιορισμός για καταχώρηση στο manifest του BroadcastReceiver για CONNECTIVITY_ACTION. Οι προγραμματιστές υποχρεούνται να μεταβούν στο NetworkCallback ή να χρησιμοποιήσουν WorkManager. Η πολιτική Google Play από τον Αύγουστο 2022 απαιτεί την αφαίρεση καταχώρησης στο manifest για αυτήν την ενέργεια.

Συχνές Ερωτήσεις

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

Το BroadcastReceiver με CONNECTIVITY_CHANGE δίνει μόνο το γεγονός αλλαγής δικτύου χωρίς λεπτομέρειες και με καθυστέρηση έως αρκετά δευτερόλεπτα. NetworkCallback λειτουργεί ασύγχρονα, παρέχει αντικείμενο Network, τύπο διεπαφής, δυνατότητες σύνδεσης και δεν απαιτεί καταχώρηση στο manifest που απαγορεύεται στο Android 12+.

Μπορεί να χρησιμοποιηθεί το NetworkCallback σε λειτουργία παρασκηνίου;

Στο Android 10+ οι περιορισμοί παρασκηνίου μπορεί να καθυστερήσουν ή να μην καλέσουν το NetworkCallback. Για εργασίες παρασκηνίου χρησιμοποιήστε WorkManager με περιορισμό NetworkType — εγγυάται την εκτέλεση εργασίας όταν πληρούνται οι συνθήκες ανεξάρτητα από τη λειτουργία εξοικονόμησης ενέργειας.

Πώς να ακυρώσετε την καταχώρηση NetworkCallback;

Καλέστε τη μέθοδο unregisterNetworkCallback στο ConnectivityManager, μεταφέροντας την ίδια παρουσία callback που χρησιμοποιήθηκε κατά την καταχώρηση. Ένα μη ακυρωμένο callback μπορεί να προκαλέσει διαρροή μνήμης, καθώς το σύστημα διατηρεί αναφορά σε αυτό. Πάντα να ακυρώνετε στο onStop ή onDestroy.

Ποια έκδοση Android απαιτείται ελάχιστα για το NetworkCallback;

Το NetworkCallback είναι διαθέσιμο από API Level 21 (Android 5.0 Lollipop). Για συσκευές με παλαιότερες εκδόσεις χρησιμοποιήστε BroadcastReceiver ή βιβλιοθήκες συμβατότητας όπως AndroidX Activity NetworkCallback που περιτυλίγουν το API για ευρύτερη υποστήριξη.

Πώς να ελέγξετε την τρέχουσα κατάσταση δικτύου χωρίς callback;

Χρησιμοποιήστε ConnectivityManager.getActiveNetwork (API 23+) μαζί με getNetworkCapabilities. Η μέθοδος επιστρέφει το τρέχον ενεργό δίκτυο σύγχρονα, χωρίς εγγραφή σε αλλαγές. Για API 21-22 χρησιμοποιήστε getActiveNetworkInfo που έχει χαρακτηριστεί ως deprecated σε νεότερες εκδόσεις.

Σύνοψη

  • NetworkCallback — αφηρημένη κλάση Android SDK για ασύγχρονη παρακολούθηση δικτύου μέσω ConnectivityManager χωρίς συνεχή poll.
  • Η μέθοδος onAvailable ειδοποιεί για σύνδεση δικτύου, onLost — για απώλεια σύνδεσης, onCapabilitiesChanged — για αλλαγή δυνατοτήτων δικτύου.
  • Καταχώρηση γίνεται μέσω registerNetworkCallback με καθορισμό NetworkRequest και παρουσίας callback.
  • Κύκλος ζωής απαιτεί ακύρωση καταχώρησης στο onStop για Activity και onPause για Fragment.
  • Τα captive portals αντιμετωπίζονται μέσω πρόσθετου HTTP αιτήματος στο generate_204 για έλεγχο πραγματικής πρόσβασης στο internet.
  • NetworkCallback αντικατέστησε το BroadcastReceiver για CONNECTIVITY_ACTION που απαγορεύεται στο manifest σε Android 12+.
  • Για εργασίες παρασκηνίου χρησιμοποιήστε WorkManager με NetworkType.CONNECTED αντί για άμεση καταχώρηση NetworkCallback.

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

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

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

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