NetworkCallback — μια αφηρημένη κλάση στο Android SDK για την παρακολούθηση αλλαγών κατάστασης δικτύου μέσω ConnectivityManager. Σύμφωνα με το Android Developers Documentation (2025), η χρήση του NetworkCallback επιτρέπει στην εφαρμογή να αντιδρά έγκαιρα στη σύνδεση, αποσύνδεση ή αλλαγή χαρακτηριστικών της σύνδεσης. ConnectivityManager.NetworkCallback παρέχει λεπτομερείς πληροφορίες σχετικά με τον τύπο δικτύου, τα captive portals και την απώλεια internet χωρίς συνεχή poll της υπηρεσίας συστήματος.
Κύρια Σημεία
NetworkCallback — είναι μια αφηρημένη κλάση από το πακέτο android.net, που αποτελεί μέρος του Android SDK. Προορίζεται για τη λήψη ειδοποιήσεων σχετικά με αλλαγές στην κατάσταση σύνδεσης δικτύου μέσω της υπηρεσίας συστήματος ConnectivityManager.
Πριν από την εμφάνιση του NetworkCallback, οι προγραμματιστές χρησιμοποιούσαν ραδιοφωνικούς δέκτες BroadcastReceiver για την παρακολούθηση δικτύου. Αυτή η προσέγγιση απαιτούσε συνεχή καταχώρηση στο manifest, λειτουργούσε με καθυστέρηση και δεν παρείχε λεπτομερείς πληροφορίες σχετικά με τα χαρακτηριστικά της σύνδεσης. Android 5.0 (API 21) εισήγαγε το NetworkCallback ως μια πιο ευέλικτη και αποδοτική εναλλακτική.
Το callback λειτουργεί ασύγχρονα: η εφαρμογή εγγράφεται σε συμβάντα μέσω ConnectivityManager και το σύστημα καλεί τις μεθόδους callback όταν αλλάζει η κατάσταση δικτύου. Αυτό εξαλείφει την ανάγκη περιοδικού polling της κατάστασης δικτύου, εξοικονομώντας πόρους μπαταρίας και επεξεργαστή.
Ο ConnectivityManager διαχειρίζεται όλες τις διεπαφές δικτύου της συσκευής — Wi-Fi, δεδομένα κινητής, Ethernet, VPN. Κατά την αλλαγή οποιασδήποτε από αυτές τις διεπαφές, το σύστημα δημιουργεί ένα αντικείμενο Network και το μεταφέρει στην αντίστοιχη μέθοδο του καταχωρημένου callback. Κάθε Network έχει ένα μοναδικό αναγνωριστικό που αλλάζει κατά την επανασύνδεση.
Το callback δεν είναι δεσμευμένο σε συγκεκριμένο τύπο δικτύου — μπορεί να παρακολουθεί όλες τις διαθέσιμες διεπαφές ταυτόχρονα. Για το φιλτράρισμα τύπων συνδέσεων χρησιμοποιείται η κλάση NetworkRequest, όπου καθορίζονται τα απαιτούμενα πρωτόκολλα μεταφοράς (Wi-Fi, δεδομένα κινητής, Ethernet) και οι δυνατότητες δικτύου.
Η καταχώρηση NetworkCallback γίνεται μέσω της μεθόδου ConnectivityManager.registerNetworkCallback. Η πρώτη παράμετρος είναι το NetworkRequest.Builder που περιγράφει τις απαιτήσεις δικτύου, η δεύτερη — μια παρουσία του callback. Για λειτουργία απαιτείται η άδεια ACCESS_NETWORK_STATE στο manifest.
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)
}
}
Συνιστάται η καταχώρηση του NetworkCallback όταν η εφαρμογή βρίσκεται στο προσκήνιο και η ακύρωση όταν πηγαίνει στο παρασκήνιο. Στο Activity είναι βολικό να χρησιμοποιείτε onStart και onStop για τη διαχείριση του κύκλου ζωής του callback. Στο Fragment — onResume και onPause.
Για απλοποίηση της διαχείρισης καταχώρησης μπορούν να χρησιμοποιηθούν Lifecycle-aware components. Η βιβλιοθήκη AndroidX Lifecycle επιτρέπει τη δημιουργία προσαρμοσμένου LifecycleObserver που αυτόματα καταχωρεί και ακυρώνει το callback όταν αλλάζει η κατάσταση του κύκλου ζωής.
Για εργασίες παρασκηνίου, η καταχώρηση γίνεται σε Service ή WorkManager. Είναι σημαντικό να λάβετε υπόψη ότι στο Android 8+ οι υπηρεσίες παρασκηνίου έχουν περιορισμούς εκκίνησης. WorkManager με NetworkType — πιο αξιόπιστος τρόπος εκτέλεσης εργασιών σε συγκεκριμένη κατάσταση δικτύου, καθώς είναι ενσωματωμένος με το API συμβατότητας και λαμβάνει υπόψη τη λειτουργία Doze.
Το NetworkCallback παρέχει ένα σύνολο μεθόδων που καλούνται όταν αλλάζει η κατάσταση δικτύου. Δεν είναι υποχρεωτικό να γίνουν override όλες οι μέθοδοι — αρκεί να υλοποιήσετε μόνο αυτές που χρειάζονται για τη συγκεκριμένη εργασία της εφαρμογής. Οι onAvailable και onLost είναι ελάχιστα απαραίτητες για βασική παρακολούθηση σύνδεσης.
| Μέθοδος | Πότε καλείται | Παράμετροι |
|---|---|---|
| onAvailable | Το δίκτυο είναι διαθέσιμο για χρήση | Network — αντικείμενο δικτύου |
| onLost | Το δίκτυο χάθηκε ή αποσυνδέθηκε | Network — αντικείμενο δικτύου |
| onCapabilitiesChanged | Οι δυνατότητες δικτύου άλλαξαν | Network, NetworkCapabilities |
| onBlockedStatusChanged | Η κατάσταση αποκλεισμού άλλαξε | Network, Boolean |
| onNetworkSuspended | Το δίκτυο αναστέλλεται από το σύστημα | Network |
| onNetworkResumed | Το δίκτυο συνεχίζεται μετά από αναστολή | Network |
Αυτή η μέθοδος είναι κλειδί για τη λήψη λεπτομερών πληροφοριών σχετικά με το δίκτυο. Η παράμετρος NetworkCapabilities περιέχει σημαίες: NET_CAPABILITY_INTERNET — πρόσβαση στο internet, NET_CAPABILITY_NOT_METERED — απεριόριστη σύνδεση, NET_CAPABILITY_NOT_ROAMING — χωρίς περιαγωγή. Επίσης μπορείτε να μάθετε την καθυστέρηση σήματος και το εύρος ζώνης.
Τα captive portals — ξεχωριστή περίπτωση: κατά τη σύνδεση σε δημόσιο δίκτυο Wi-Fi μέσω πύλης, η μέθοδος onCapabilitiesChanged δεν εμφανίζει αμέσως INTERNET. Πρώτα το δίκτυο είναι διαθέσιμο, αλλά χωρίς internet — απαιτείται εξουσιοδότηση μέσω προγράμματος περιήγησης. Ο προγραμματιστής πρέπει να λάβει υπόψη αυτή την καθυστέρηση στη λογική της εφαρμογής.
Καλείται όταν το σύστημα αποκλείει την κυκλοφορία δικτύου για την εφαρμογή — για παράδειγμα, κατά την ενεργοποίηση λειτουργίας εξοικονόμησης δεδομένων ή περιορισμού δεδομένων παρασκηνίου. onBlockedStatusChanged επιτρέπει στην εφαρμογή να γνωρίζει ότι τα αιτήματά της δικτύου είναι προσωρινά απαγορευμένα και να μεταβεί σε τοπική επεξεργασία.
Ας εξετάσουμε την πρακτική υλοποίηση του NetworkCallback για την παρακολούθηση πρόσβασης στο internet και τον χειρισμό captive portals. Στο παρακάτω παράδειγμα φαίνεται ο έλεγχος NET_CAPABILITY_INTERNET και η επικύρωση σύνδεσης μέσω HTTP αιτήματος στον διακομιστή Google.
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}")
// Διακοπή αιτημάτων δικτύου
}
}
Κατά τη σύνδεση σε δημόσιο δίκτυο με εξουσιοδότηση (καφετέρια, αεροδρόμιο), το σύστημα πρώτα αναφέρει onAvailable, αλλά η onCapabilitiesChanged μπορεί να μην εμφανίζει INTERNET. Σε τέτοιες περιπτώσεις απαιτείται πρόσθετος έλεγχος μέσω HTTP αιτήματος σε ένα σταθερό endpoint, για παράδειγμα https://www.google.com/generate_204.
Εάν το αίτημα επιστρέφει κωδικό 204 — υπάρχει internet. Εάν ανακατεύθυνση (301, 302, 307) — απαιτείται εξουσιοδότηση μέσω προγράμματος περιήγησης. Σε αυτήν την περίπτωση, μπορείτε να ανοίξετε WebView ή Intent στη διεύθυνση URL ανακατεύθυνσης για έλεγχο ταυτότητας στην πύλη.
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 | Καθυστέρηση | Λεπτομέρεια | Κατανάλωση Ενέργειας |
|---|---|---|---|---|
| BroadcastReceiver | 1+ | υψηλή | χαμηλή | υψηλή |
| NetworkCallback | 21+ | χαμηλή | υψηλή | χαμηλή |
| ConnectivityManager.getActiveNetwork | 23+ | άμεση | μεσαία | μηδενική |
| NWPathMonitor (iOS) | iOS 12+ | χαμηλή | υψηλή | χαμηλή |
Από το Android 10, το επίπεδο περιορισμών παρασκηνίου έχει αυστηροποιηθεί και το NetworkCallback μπορεί να μην καλείται όταν η εφαρμογή βρίσκεται στο παρασκήνιο. Για κρίσιμα σημαντικές εργασίες — για παράδειγμα, φόρτωση δεδομένων κατά την εμφάνιση δικτύου — χρησιμοποιήστε WorkManager με περιορισμό NetworkType.CONNECTED. Το WorkManager εγγυάται την εκτέλεση της εργασίας όταν πληρούνται οι συνθήκες δικτύου.
Στο Android 12+ εμφανίστηκε περιορισμός για καταχώρηση στο manifest του BroadcastReceiver για CONNECTIVITY_ACTION. Οι προγραμματιστές υποχρεούνται να μεταβούν στο NetworkCallback ή να χρησιμοποιήσουν WorkManager. Η πολιτική Google Play από τον Αύγουστο 2022 απαιτεί την αφαίρεση καταχώρησης στο manifest για αυτήν την ενέργεια.
Συχνές Ερωτήσεις
Το BroadcastReceiver με CONNECTIVITY_CHANGE δίνει μόνο το γεγονός αλλαγής δικτύου χωρίς λεπτομέρειες και με καθυστέρηση έως αρκετά δευτερόλεπτα. NetworkCallback λειτουργεί ασύγχρονα, παρέχει αντικείμενο Network, τύπο διεπαφής, δυνατότητες σύνδεσης και δεν απαιτεί καταχώρηση στο manifest που απαγορεύεται στο Android 12+.
Στο Android 10+ οι περιορισμοί παρασκηνίου μπορεί να καθυστερήσουν ή να μην καλέσουν το NetworkCallback. Για εργασίες παρασκηνίου χρησιμοποιήστε WorkManager με περιορισμό NetworkType — εγγυάται την εκτέλεση εργασίας όταν πληρούνται οι συνθήκες ανεξάρτητα από τη λειτουργία εξοικονόμησης ενέργειας.
Καλέστε τη μέθοδο unregisterNetworkCallback στο ConnectivityManager, μεταφέροντας την ίδια παρουσία callback που χρησιμοποιήθηκε κατά την καταχώρηση. Ένα μη ακυρωμένο callback μπορεί να προκαλέσει διαρροή μνήμης, καθώς το σύστημα διατηρεί αναφορά σε αυτό. Πάντα να ακυρώνετε στο onStop ή onDestroy.
Το NetworkCallback είναι διαθέσιμο από API Level 21 (Android 5.0 Lollipop). Για συσκευές με παλαιότερες εκδόσεις χρησιμοποιήστε BroadcastReceiver ή βιβλιοθήκες συμβατότητας όπως AndroidX Activity NetworkCallback που περιτυλίγουν το API για ευρύτερη υποστήριξη.
Χρησιμοποιήστε ConnectivityManager.getActiveNetwork (API 23+) μαζί με getNetworkCapabilities. Η μέθοδος επιστρέφει το τρέχον ενεργό δίκτυο σύγχρονα, χωρίς εγγραφή σε αλλαγές. Για API 21-22 χρησιμοποιήστε getActiveNetworkInfo που έχει χαρακτηριστεί ως deprecated σε νεότερες εκδόσεις.
Σύνοψη
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης