NetworkCallback Android SDK में एक अमूर्त वर्ग है जो ConnectivityManager के माध्यम से नेटवर्क स्थिति में होने वाले परिवर्तनों की निगरानी के लिए है। Android Developers Documentation (2025) के अनुसार, NetworkCallback का उपयोग एप्लिकेशन को कनेक्शन, डिस्कनेक्शन या कनेक्शन विशेषताओं में बदलाव पर समय पर प्रतिक्रिया देने की अनुमति देता है। ConnectivityManager.NetworkCallback सिस्टम सेवा को लगातार पोल किए बिना नेटवर्क प्रकार, कैप्टिव पोर्टल और इंटरनेट खत्म होने के बारे में विस्तृत जानकारी प्रदान करता है।
मुख्य बिंदु
NetworkCallback android.net पैकेज से एक अमूर्त वर्ग है, जो Android SDK का हिस्सा है। यह ConnectivityManager सिस्टम सेवा के माध्यम से नेटवर्क कनेक्शन स्थिति में परिवर्तनों के बारे में सूचनाएँ प्राप्त करने के लिए डिज़ाइन किया गया है।
NetworkCallback से पहले, डेवलपर्स नेटवर्क परिवर्तनों को ट्रैक करने के लिए BroadcastReceiver का उपयोग करते थे। इस दृष्टिकोण के लिए मैनिफेस्ट में निरंतर पंजीकरण की आवश्यकता थी, इसमें देरी होती थी और यह कनेक्शन विशेषताओं के बारे में विस्तृत जानकारी प्रदान नहीं करता था। Android 5.0 (API 21) ने NetworkCallback को अधिक लचीले और प्रभावी विकल्प के रूप में पेश किया।
कॉलबैक एसिंक्रोनस रूप से काम करता है: एप्लिकेशन ConnectivityManager के माध्यम से घटनाओं की सदस्यता लेता है, और नेटवर्क स्थिति बदलने पर सिस्टम कॉलबैक विधियों को कॉल करता है। इससे नेटवर्क स्थिति के आवधिक पोलिंग की आवश्यकता समाप्त हो जाती है, जिससे बैटरी और CPU संसाधनों की बचत होती है।
ConnectivityManager डिवाइस पर सभी नेटवर्क इंटरफ़ेस — Wi-Fi, मोबाइल डेटा, Ethernet, VPN का प्रबंधन करता है। जब इनमें से कोई भी इंटरफ़ेस बदलता है, सिस्टम एक Network ऑब्जेक्ट बनाता है और इसे पंजीकृत कॉलबैक की संबंधित विधि में भेजता है। प्रत्येक Network का एक अद्वितीय पहचानकर्ता होता है जो पुनः कनेक्ट होने पर बदल जाता है।
कॉलबैक किसी विशिष्ट नेटवर्क प्रकार से बंधा नहीं है — यह एक साथ सभी उपलब्ध इंटरफ़ेस को ट्रैक कर सकता है। कनेक्शन प्रकारों को फ़िल्टर करने के लिए NetworkRequest क्लास का उपयोग किया जाता है, जो आवश्यक परिवहन प्रोटोकॉल (Wi-Fi, सेल्युलर डेटा, Ethernet) और नेटवर्क क्षमताओं को निर्दिष्ट करता है।
NetworkCallback पंजीकरण ConnectivityManager.registerNetworkCallback विधि के माध्यम से किया जाता है। पहला पैरामीटर एक NetworkRequest.Builder है जो नेटवर्क आवश्यकताओं का वर्णन करता है, दूसरा कॉलबैक इंस्टेंस है। मैनिफेस्ट में ACCESS_NETWORK_STATE अनुमति आवश्यक है।
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", "Available: ${network}")
}
override fun onLost(network: Network) {
Log.d("Network", "Lost: ${network}")
}
}
fun register() {
connectivityManager.registerNetworkCallback(
NetworkRequest.Builder().build(), callback
)
}
fun unregister() {
connectivityManager.unregisterNetworkCallback(callback)
}
}
अनुशंसा की जाती है कि जब ऐप अग्रभूमि में हो तब NetworkCallback पंजीकृत करें और पृष्ठभूमि में जाने पर रद्द करें। Activity में, कॉलबैक जीवनचक्र प्रबंधित करने के लिए onStart और onStop का उपयोग करें। Fragment में, onResume और onPause का उपयोग करें।
पंजीकरण प्रबंधन को सरल बनाने के लिए, आप Lifecycle-जागरूक घटकों का उपयोग कर सकते हैं। AndroidX Lifecycle लाइब्रेरी आपको एक कस्टम LifecycleObserver बनाने की अनुमति देती है जो जीवनचक्र स्थिति बदलने पर स्वचालित रूप से कॉलबैक को पंजीकृत और रद्द करता है।
पृष्ठभूमि कार्यों के लिए, पंजीकरण Service या WorkManager में किया जाता है। ध्यान दें कि Android 8+ पर, पृष्ठभूमि सेवाओं पर लॉन्च प्रतिबंध हैं। NetworkType के साथ WorkManager एक विशिष्ट नेटवर्क स्थिति के तहत कार्यों को निष्पादित करने का अधिक विश्वसनीय तरीका है, क्योंकि यह संगतता API के साथ एकीकृत है और Doze मोड का सम्मान करता है।
NetworkCallback विधियों का एक सेट प्रदान करता है जो नेटवर्क स्थिति बदलने पर कॉल की जाती हैं। सभी विधियों को ओवरराइड करना आवश्यक नहीं है — केवल वही लागू करें जिनकी आपके ऐप के विशिष्ट कार्य के लिए आवश्यकता है। onAvailable और onLost बुनियादी कनेक्शन निगरानी के लिए न्यूनतम आवश्यक हैं।
| विधि | कब कॉल की जाती है | पैरामीटर |
|---|---|---|
| onAvailable | नेटवर्क उपयोग के लिए उपलब्ध है | Network — नेटवर्क ऑब्जेक्ट |
| onLost | नेटवर्क खो गया या डिस्कनेक्ट हो गया | Network — नेटवर्क ऑब्जेक्ट |
| onCapabilitiesChanged | नेटवर्क क्षमताएँ बदल गईं | Network, NetworkCapabilities |
| onBlockedStatusChanged | ब्लॉकिंग स्थिति बदल गई | Network, Boolean |
| onNetworkSuspended | सिस्टम द्वारा नेटवर्क निलंबित | Network |
| onNetworkResumed | निलंबन के बाद नेटवर्क फिर से शुरू | Network |
यह विधि नेटवर्क के बारे में विस्तृत जानकारी प्राप्त करने के लिए महत्वपूर्ण है। NetworkCapabilities पैरामीटर में फ़्लैग होते हैं: NET_CAPABILITY_INTERNET — इंटरनेट तक पहुँच उपलब्ध, NET_CAPABILITY_NOT_METERED — असीमित कनेक्शन, NET_CAPABILITY_NOT_ROAMING — कोई रोमिंग नहीं। सिग्नल विलंबता और बैंडविड्थ भी जाना जा सकता है।
कैप्टिव पोर्टल एक विशेष मामला है: किसी पोर्टल के माध्यम से सार्वजनिक Wi-Fi नेटवर्क से कनेक्ट होने पर, onCapabilitiesChanged विधि तुरंत INTERNET नहीं दिखाती है। नेटवर्क शुरू में उपलब्ध है लेकिन इंटरनेट के बिना — ब्राउज़र के माध्यम से प्राधिकरण आवश्यक है। डेवलपर्स को ऐप तर्क में इस देरी को ध्यान में रखना होगा।
जब सिस्टम ऐप के लिए नेटवर्क ट्रैफ़िक ब्लॉक करता है — उदाहरण के लिए, डेटा सेवर मोड चालू होने पर या पृष्ठभूमि डेटा प्रतिबंधित होने पर — यह कॉल की जाती है। onBlockedStatusChanged ऐप को बताता है कि उसके नेटवर्क अनुरोध अस्थायी रूप से प्रतिबंधित हैं और स्थानीय प्रोसेसिंग पर स्विच करें।
आइए इंटरनेट एक्सेस की निगरानी और कैप्टिव पोर्टल को संभालने के लिए एक व्यावहारिक NetworkCallback कार्यान्वयन देखें। नीचे दिया गया उदाहरण NET_CAPABILITY_INTERNET की जाँच और Google सर्वर पर HTTP अनुरोध के माध्यम से कनेक्शन सत्यापन दिखाता है।
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", "Mobile data connected")
hasInternet ->
Log.d("Network", "Wi-Fi connected")
else ->
Log.d("Network", "No internet access")
}
}
override fun onLost(network: Network) {
Log.d("Network", "Connection lost: ${network}")
// नेटवर्क अनुरोध रोकें
}
}
प्राधिकरण के साथ सार्वजनिक नेटवर्क (कैफ़े, हवाई अड्डा) से कनेक्ट होने पर, सिस्टम पहले onAvailable बताता है, लेकिन onCapabilitiesChanged INTERNET नहीं दिखा सकता है। ऐसे मामलों में, एक स्थिर एंडपॉइंट जैसे https://www.google.com/generate_204 पर HTTP अनुरोध के माध्यम से अतिरिक्त सत्यापन आवश्यक है।
यदि अनुरोध कोड 204 लौटाता है — इंटरनेट उपलब्ध है। यदि रीडायरेक्ट (301, 302, 307) — ब्राउज़र के माध्यम से प्राधिकरण आवश्यक है। इस मामले में, आप पोर्टल प्रमाणीकरण पूरा करने के लिए रीडायरेक्ट URL पर एक WebView या Intent खोल सकते हैं।
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 is available")
in HttpURLConnection.HTTP_MOVED_PERM
..HttpURLConnection.HTTP_TEMP_REDIRECT ->
Log.d("Network", "Captive portal detected")
}
connection.disconnect()
} catch (e: Exception) {
Log.e("Network", "Validation failed: ${e.message}")
}
}
}
NetworkCallback से पहले, नेटवर्क निगरानी का प्राथमिक तरीका android.net.conn.CONNECTIVITY_CHANGE फ़िल्टर के साथ BroadcastReceiver था। इस दृष्टिकोण में महत्वपूर्ण कमियाँ थीं: कई सेकंड की देरी, इंटरफ़ेस प्रकार की जानकारी का अभाव, और डिवाइस के लगातार जागने के कारण बढ़ी हुई बिजली खपत।
एक आधुनिक विकल्प LiveData या StateFlow को NetworkCallback के साथ जोड़ना है। पैटर्न में कॉलबैक को एक रिएक्टिव स्ट्रीम में लपेटना शामिल है जो स्वचालित रूप से UI को स्थिति परिवर्तनों के बारे में सूचित करता है। उदाहरण के लिए, NetworkStatus प्रकार वाला MutableStateFlow कॉलबैक विधियों के अंदर अपडेट होता है, और ViewCollector परिवर्तनों की सदस्यता लेता है।
| विधि | API Level | विलंबता | विस्तार स्तर | बिजली खपत |
|---|---|---|---|---|
| BroadcastReceiver | 1+ | उच्च | निम्न | उच्च |
| NetworkCallback | 21+ | निम्न | उच्च | निम्न |
| ConnectivityManager.getActiveNetwork | 23+ | तत्काल | मध्यम | शून्य |
| NWPathMonitor (iOS) | iOS 12+ | निम्न | उच्च | निम्न |
Android 10 से शुरू होकर, पृष्ठभूमि प्रतिबंध सख्त हो गए हैं, और ऐप पृष्ठभूमि में होने पर NetworkCallback कॉल नहीं किया जा सकता है। महत्वपूर्ण कार्यों के लिए — जैसे नेटवर्क उपलब्ध होने पर डेटा लोड करना — NetworkType.CONNECTED बाधा के साथ WorkManager का उपयोग करें। WorkManager नेटवर्क शर्तें पूरी होने पर कार्य निष्पादन की गारंटी देता है।
Android 12+ में, CONNECTIVITY_ACTION के लिए BroadcastReceiver के मैनिफेस्ट पंजीकरण पर प्रतिबंध है। डेवलपर्स को NetworkCallback पर माइग्रेट करना होगा या WorkManager का उपयोग करना होगा। Google Play नीति अगस्त 2022 से इस कार्रवाई के लिए मैनिफेस्ट पंजीकरण हटाने की आवश्यकता रखती है।
अक्सर पूछे जाने वाले प्रश्न
BroadcastReceiver CONNECTIVITY_CHANGE के साथ बिना विवरण के और कई सेकंड तक की देरी के साथ केवल नेटवर्क परिवर्तन का तथ्य प्रदान करता है। NetworkCallback एसिंक्रोनस रूप से काम करता है, Network ऑब्जेक्ट, इंटरफ़ेस प्रकार, कनेक्शन क्षमताएँ प्रदान करता है और मैनिफेस्ट पंजीकरण की आवश्यकता नहीं होती, जो Android 12+ पर प्रतिबंधित है।
Android 10+ पर, पृष्ठभूमि प्रतिबंध NetworkCallback को कॉल किए जाने में देरी या रोक सकते हैं। पृष्ठभूमि कार्यों के लिए, NetworkType बाधा के साथ WorkManager का उपयोग करें — यह बिजली बचत मोड की परवाह किए बिना शर्तें पूरी होने पर कार्य निष्पादन की गारंटी देता है।
ConnectivityManager पर unregisterNetworkCallback विधि कॉल करें, पंजीकरण के समय उपयोग किए गए उसी कॉलबैक इंस्टेंस को पास करें। अपंजीकृत कॉलबैक मेमोरी लीक का कारण बन सकता है क्योंकि सिस्टम उसका संदर्भ रखता है। हमेशा onStop या onDestroy में पंजीकरण रद्द करें।
NetworkCallback API Level 21 (Android 5.0 Lollipop) से उपलब्ध है। पुराने संस्करणों वाले उपकरणों के लिए, BroadcastReceiver या संगतता लाइब्रेरी जैसे AndroidX Activity NetworkCallback का उपयोग करें, जो व्यापक समर्थन के लिए API को रैप करती हैं।
ConnectivityManager.getActiveNetwork (API 23+) का उपयोग getNetworkCapabilities के साथ करें। यह विधि बिना परिवर्तनों की सदस्यता लिए, सिंक्रोनस रूप से वर्तमान सक्रिय नेटवर्क लौटाती है। API 21-22 के लिए, getActiveNetworkInfo का उपयोग करें, जो नए संस्करणों में डेप्रिकेटेड चिह्नित है।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें