Android, ऐप्लिकेशन को कनेक्टिविटी में होने वाले डाइनैमिक बदलावों के बारे में जानने की सुविधा देता है. कनेक्टिविटी में होने वाले बदलावों को ट्रैक करने और उनका जवाब देने के लिए, इन क्लास का इस्तेमाल करें:
ConnectivityManagerआपके ऐप्लिकेशन को सिस्टम में कनेक्टिविटी की स्थिति के बारे में बताता है.Networkक्लास, उन नेटवर्क में से किसी एक को दिखाती है जिनसे डिवाइस कनेक्ट है.Networkऑब्जेक्ट का इस्तेमाल, नेटवर्क के बारे में जानकारी इकट्ठा करने के लिएConnectivityManagerके साथ किया जा सकता है. इसके अलावा, इसका इस्तेमाल नेटवर्क पर सॉकेट बाइंड करने के लिए भी किया जा सकता है. नेटवर्क डिसकनेक्ट होने पर,Networkऑब्जेक्ट का इस्तेमाल नहीं किया जा सकता. अगर डिवाइस बाद में उसी नेटवर्क से फिर से कनेक्ट हो जाता है, तो भी नयाNetworkऑब्जेक्ट, नए नेटवर्क को दिखाता है.LinkPropertiesऑब्जेक्ट में, नेटवर्क के लिंक के बारे में जानकारी होती है. जैसे, डीएनएस सर्वर की सूची, लोकल आईपी पते, और नेटवर्क के लिए इंस्टॉल किए गए नेटवर्क रूट.NetworkCapabilitiesऑब्जेक्ट में नेटवर्क की प्रॉपर्टी के बारे में जानकारी होती है. जैसे, ट्रांसपोर्ट (वाई-फ़ाई, मोबाइल, ब्लूटूथ) और नेटवर्क की क्षमता. उदाहरण के लिए, ऑब्जेक्ट से यह क्वेरी की जा सकती है कि नेटवर्क, एमएमएस भेजने में सक्षम है या नहीं, कैप्टिव पोर्टल के पीछे है या मीटर किया गया है.
जिन ऐप्लिकेशन को किसी भी समय कनेक्टिविटी की मौजूदा स्थिति के बारे में जानना होता है वे ConnectivityManager तरीकों को कॉल कर सकते हैं. इससे उन्हें यह पता चल जाता है कि किस तरह का नेटवर्क उपलब्ध है. ये तरीके, डीबग करने और किसी भी समय उपलब्ध कनेक्टिविटी की समीक्षा करने के लिए मददगार होते हैं.
हालांकि, सिंक्रोनस ConnectivityManager तरीके, कॉल के बाद होने वाली किसी भी गतिविधि के बारे में आपके ऐप्लिकेशन को नहीं बताते. इसलिए, वे आपको यूज़र इंटरफ़ेस (यूआई) अपडेट करने की अनुमति नहीं देते. नेटवर्क के डिसकनेक्ट होने या नेटवर्क की क्षमताओं में बदलाव होने पर, ये ऐप्लिकेशन के व्यवहार में बदलाव नहीं कर सकते.
कनेक्टिविटी की स्थिति कभी भी बदल सकती है. साथ ही, ज़्यादातर ऐप्लिकेशन को डिवाइस पर नेटवर्क की स्थिति के बारे में हमेशा नई और अप-टू-डेट जानकारी चाहिए होती है. ऐप्लिकेशन, ConnectivityManager के साथ कॉलबैक रजिस्टर कर सकते हैं, ताकि उन्हें उन बदलावों के बारे में सूचना मिल सके जो ऐप्लिकेशन के लिए ज़रूरी हैं. कॉल बैक का इस्तेमाल करके, आपका ऐप्लिकेशन कनेक्टिविटी में हुए किसी भी ज़रूरी बदलाव पर तुरंत प्रतिक्रिया दे सकता है. इसके लिए, आपको महंगी पोलिंग का इस्तेमाल करने की ज़रूरत नहीं है. ऐसा हो सकता है कि पोलिंग में, तेज़ी से होने वाले अपडेट छूट जाएं.
NetworkCallback और डिवाइस के कनेक्टिविटी स्टेटस के बारे में पता लगाने के अन्य तरीकों का इस्तेमाल करने के लिए, किसी खास अनुमति की ज़रूरत नहीं होती.
हालांकि, कुछ नेटवर्क के लिए खास अनुमतियां ज़रूरी होती हैं.
उदाहरण के लिए, ऐसा हो सकता है कि कुछ नेटवर्क पर पाबंदी लगी हो और वे ऐप्लिकेशन के लिए उपलब्ध न हों. बैकग्राउंड नेटवर्क से बाइंड करने के लिए, CHANGE_NETWORK_STATE की अनुमति ज़रूरी है. साथ ही, कुछ कॉल को चलाने के लिए खास अनुमतियों की ज़रूरत पड़ सकती है. ज़्यादा जानकारी के लिए, हर कॉल से जुड़ा दस्तावेज़ देखें.
मौजूदा स्थिति की जानकारी तुरंत पाना
Android डिवाइस एक साथ कई कनेक्शन बनाए रख सकता है.
नेटवर्क की मौजूदा स्थिति के बारे में जानकारी पाने के लिए, सबसे पहले ConnectivityManager का इंस्टेंस पाएं:
Kotlin
val connectivityManager = getSystemService(ConnectivityManager::class.java)
Java
ConnectivityManager connectivityManager = getSystemService(ConnectivityManager.class);
इसके बाद, इस इंस्टेंस का इस्तेमाल करके अपने ऐप्लिकेशन के मौजूदा डिफ़ॉल्ट नेटवर्क का रेफ़रंस पाएं:
Kotlin
val currentNetwork = connectivityManager.getActiveNetwork()
Java
Network currentNetwork = connectivityManager.getActiveNetwork();
किसी नेटवर्क का रेफ़रंस देकर, आपका ऐप्लिकेशन उसके बारे में जानकारी का अनुरोध कर सकता है:
Kotlin
val caps = connectivityManager.getNetworkCapabilities(currentNetwork) val linkProperties = connectivityManager.getLinkProperties(currentNetwork)
Java
NetworkCapabilities caps = connectivityManager.getNetworkCapabilities(currentNetwork); LinkProperties linkProperties = connectivityManager.getLinkProperties(currentNetwork);
ज़्यादा काम की सुविधाओं के लिए, NetworkCallback रजिस्टर करें.
नेटवर्क कॉलबैक रजिस्टर करने के बारे में ज़्यादा जानने के लिए, नेटवर्क इवेंट सुनना लेख पढ़ें.
NetworkCapabilities और LinkProperties
NetworkCapabilities और LinkProperties ऑब्जेक्ट, उन सभी एट्रिब्यूट के बारे में जानकारी देते हैं जिनके बारे में सिस्टम को किसी नेटवर्क के बारे में पता होता है.
LinkProperties ऑब्जेक्ट को रास्तों, लिंक पतों, इंटरफ़ेस के नाम, प्रॉक्सी की जानकारी (अगर कोई हो) और डीएनएस सर्वर के बारे में पता होता है. आपको जो जानकारी चाहिए उसे पाने के लिए, LinkProperties ऑब्जेक्ट पर मौजूद तरीके को कॉल करें.
NetworkCapabilities ऑब्जेक्ट में, नेटवर्क ट्रांसपोर्ट और उनकी क्षमताओं के बारे में जानकारी शामिल होती है.
ट्रांसपोर्ट, नेटवर्क के काम करने के लिए इस्तेमाल होने वाले फ़िज़िकल मीडियम का एक वर्चुअल पता होता है. ट्रांसपोर्ट के सामान्य उदाहरणों में, Ethernet, वाई-फ़ाई, और मोबाइल शामिल हैं.
वीपीएन और पीयर-टू-पीयर वाई-फ़ाई का इस्तेमाल भी ट्रांसपोर्ट के तौर पर किया जा सकता है.
Android पर, एक नेटवर्क में एक ही समय पर कई ट्रांसपोर्ट हो सकते हैं. इसका एक उदाहरण, वाई-फ़ाई और मोबाइल नेटवर्क, दोनों पर काम करने वाला वीपीएन है. वीपीएन में वाई-फ़ाई, मोबाइल, और वीपीएन ट्रांसपोर्ट की सुविधा होती है. यह पता लगाने के लिए कि किसी नेटवर्क में कोई खास ट्रांसपोर्ट है या नहीं, NetworkCapabilities.TRANSPORT_* कॉन्स्टेंट में से किसी एक के साथ NetworkCapabilities.hasTransport(int) तरीके का इस्तेमाल करें.
क्षमता, नेटवर्क की किसी प्रॉपर्टी के बारे में बताती है. उदाहरण के लिए, MMS, NOT_METERED, और INTERNET. एमएमएस की सुविधा देने वाला नेटवर्क, मल्टीमीडिया मैसेजिंग सेवा के मैसेज भेज और पा सकता है. हालांकि, यह सुविधा न देने वाला नेटवर्क ऐसा नहीं कर सकता. NOT_METERED सुविधा वाले नेटवर्क में, उपयोगकर्ता से डेटा के लिए बिल नहीं लिया जाता. आपका ऐप्लिकेशन, NetworkCapabilities.NET_CAPABILITY_* कॉन्स्टेंट में से किसी एक के साथ NetworkCapabilities.hasCapability(int) तरीके का इस्तेमाल करके, सही सुविधाओं की जांच कर सकता है.
सबसे ज़्यादा काम आने वाली NET_CAPABILITY_* कॉन्स्टेंट में ये शामिल हैं:
NET_CAPABILITY_INTERNET: इससे पता चलता है कि इंटरनेट ऐक्सेस करने के लिए नेटवर्क सेट अप किया गया है. यह सेटअप के बारे में है, न कि सार्वजनिक सर्वर तक पहुंचने की क्षमता के बारे में. उदाहरण के लिए, किसी नेटवर्क को इंटरनेट ऐक्सेस करने के लिए सेट अप किया जा सकता है. हालांकि, इस पर कैप्टिव पोर्टल लागू होगा.आम तौर पर, किसी कैरियर के मोबाइल नेटवर्क में
INTERNETकी सुविधा होती है. वहीं, लोकल P2P वाई-फ़ाई नेटवर्क में यह सुविधा नहीं होती. कनेक्टिविटी की मौजूदा स्थिति देखने के लिए,NET_CAPABILITY_VALIDATEDपर जाएं.NET_CAPABILITY_NOT_METERED: इससे पता चलता है कि नेटवर्क सीमित डेटा वाला नहीं है. किसी नेटवर्क को सीमित डेटा वाला तब माना जाता है, जब उपयोगकर्ता को डेटा इस्तेमाल करने के लिए शुल्क देना पड़ता है, डेटा इस्तेमाल करने की सीमा तय होती है या बैटरी की परफ़ॉर्मेंस से जुड़ी समस्याएं होती हैं.NET_CAPABILITY_NOT_VPN: इससे पता चलता है कि नेटवर्क, वर्चुअल प्राइवेट नेटवर्क नहीं है.NET_CAPABILITY_VALIDATED: से पता चलता है कि जांच करने पर, नेटवर्क लोगों को इंटरनेट का ऐक्सेस देता है. कैप्टिव पोर्टल वाले नेटवर्क या ऐसे नेटवर्क के पास यह सुविधा नहीं होती जो डोमेन नेम रिज़ॉल्यूशन की सुविधा नहीं देता. सिस्टम, नेटवर्क के बारे में ज़्यादा से ज़्यादा इतनी जानकारी दे सकता है कि वह नेटवर्क, इंटरनेट का ऐक्सेस दे रहा है या नहीं. हालांकि, पुष्टि किए गए नेटवर्क पर भी सिद्धांत के तौर पर, आईपी पते के आधार पर फ़िल्टरिंग लागू की जा सकती है. इसके अलावा, खराब सिग्नल जैसी समस्याओं की वजह से, कनेक्टिविटी में अचानक रुकावटें आ सकती हैं.NET_CAPABILITY_CAPTIVE_PORTAL: इससे पता चलता है कि नेटवर्क में कैप्टिव पोर्टल है.
ऐसी अन्य सुविधाएं भी हैं जिनमें ज़्यादा खास ऐप्लिकेशन दिलचस्पी दिखा सकते हैं.
ज़्यादा जानकारी के लिए, NetworkCapabilities.hasCapability(int) में पैरामीटर की परिभाषाएं पढ़ें.
नेटवर्क की सुविधाएं कभी भी बदली जा सकती हैं. जब सिस्टम को किसी कैप्टिव पोर्टल का पता चलता है, तो वह एक सूचना दिखाता है. इसमें उपयोगकर्ता को लॉग इन करने का न्योता दिया जाता है. इस दौरान, नेटवर्क में NET_CAPABILITY_INTERNET और NET_CAPABILITY_CAPTIVE_PORTAL की सुविधाएं उपलब्ध होती हैं, लेकिन NET_CAPABILITY_VALIDATED की सुविधा उपलब्ध नहीं होती.
जब उपयोगकर्ता कार्रवाई करता है और कैप्टिव पोर्टल पेज पर लॉग इन करता है, तो डिवाइस सार्वजनिक इंटरनेट को ऐक्सेस कर पाता है. साथ ही, नेटवर्क को NET_CAPABILITY_VALIDATED की सुविधा मिल जाती है और NET_CAPABILITY_CAPTIVE_PORTAL की सुविधा खत्म हो जाती है.
इसी तरह, किसी नेटवर्क के ट्रांसपोर्ट को डाइनैमिक तरीके से बदला जा सकता है.
उदाहरण के लिए, वीपीएन खुद को फिर से कॉन्फ़िगर कर सकता है, ताकि वह अभी-अभी उपलब्ध हुए तेज़ नेटवर्क का इस्तेमाल कर सके. जैसे, मोबाइल नेटवर्क से वाई-फ़ाई पर स्विच करना. इस मामले में, नेटवर्क TRANSPORT_CELLULAR ट्रांसपोर्ट को हटा देता है और TRANSPORT_WIFI ट्रांसपोर्ट को जोड़ देता है. हालांकि, TRANSPORT_VPN ट्रांसपोर्ट को बनाए रखता है.
नेटवर्क इवेंट को मॉनिटर करने की अनुमति
नेटवर्क इवेंट के बारे में जानने के लिए, NetworkCallback क्लास का इस्तेमाल ConnectivityManager.registerDefaultNetworkCallback(NetworkCallback) और ConnectivityManager.registerNetworkCallback(NetworkCallback) के साथ करें. इन दोनों तरीकों का इस्तेमाल अलग-अलग मकसद से किया जाता है.
सभी Android ऐप्लिकेशन के लिए, डिफ़ॉल्ट नेटवर्क होता है. इसे सिस्टम तय करता है. आम तौर पर, सिस्टम मीटर किए गए नेटवर्क के बजाय, बिना मीटर वाले नेटवर्क को प्राथमिकता देता है. साथ ही, धीमे नेटवर्क के बजाय तेज़ नेटवर्क को प्राथमिकता देता है.
जब कोई ऐप्लिकेशन, नेटवर्क का अनुरोध करता है, जैसे कि HttpsURLConnection के साथ, तो सिस्टम डिफ़ॉल्ट नेटवर्क का इस्तेमाल करके इस अनुरोध को पूरा करता है. ऐप्लिकेशन, अन्य नेटवर्क पर भी ट्रैफ़िक भेज सकते हैं. ज़्यादा जानकारी के लिए, अतिरिक्त नेटवर्क सेक्शन देखें.
डिफ़ॉल्ट नेटवर्क के तौर पर सेट किए गए नेटवर्क को, ऐप्लिकेशन के चालू रहने के दौरान कभी भी बदला जा सकता है. इसका एक सामान्य उदाहरण यह है कि डिवाइस, किसी ऐसे वाई-फ़ाई ऐक्सेस पॉइंट की रेंज में आ जाता है जो जाना-पहचाना, चालू, बिना शुल्क वाला, और मोबाइल नेटवर्क से ज़्यादा तेज़ हो. डिवाइस इस ऐक्सेस पॉइंट से कनेक्ट हो जाता है. साथ ही, सभी ऐप्लिकेशन के लिए डिफ़ॉल्ट नेटवर्क को नए वाई-फ़ाई नेटवर्क पर स्विच कर देता है.
जब कोई नया नेटवर्क डिफ़ॉल्ट बन जाता है, तो ऐप्लिकेशन जिस भी नए कनेक्शन को खोलता है उसके लिए इस नेटवर्क का इस्तेमाल किया जाता है. कुछ समय बाद, पिछले डिफ़ॉल्ट नेटवर्क पर मौजूद सभी कनेक्शन बंद कर दिए जाते हैं. अगर ऐप्लिकेशन के लिए यह जानना ज़रूरी है कि डिफ़ॉल्ट नेटवर्क कब बदलता है, तो वह डिफ़ॉल्ट नेटवर्क कॉलबैक को इस तरह रजिस्टर करता है:
Kotlin
connectivityManager.registerDefaultNetworkCallback(object : ConnectivityManager.NetworkCallback() { override fun onAvailable(network : Network) { Log.e(TAG, "The default network is now: " + network) } override fun onLost(network : Network) { Log.e(TAG, "The application no longer has a default network. The last default network was " + network) } override fun onCapabilitiesChanged(network : Network, networkCapabilities : NetworkCapabilities) { Log.e(TAG, "The default network changed capabilities: " + networkCapabilities) } override fun onLinkPropertiesChanged(network : Network, linkProperties : LinkProperties) { Log.e(TAG, "The default network changed link properties: " + linkProperties) } })
Java
connectivityManager.registerDefaultNetworkCallback(new ConnectivityManager.NetworkCallback() { @Override public void onAvailable(Network network) { Log.e(TAG, "The default network is now: " + network); } @Override public void onLost(Network network) { Log.e(TAG, "The application no longer has a default network. The last default network was " + network); } @Override public void onCapabilitiesChanged(Network network, NetworkCapabilities networkCapabilities) { Log.e(TAG, "The default network changed capabilities: " + networkCapabilities); } @Override public void onLinkPropertiesChanged(Network network, LinkProperties linkProperties) { Log.e(TAG, "The default network changed link properties: " + linkProperties); } });
जब कोई नया नेटवर्क डिफ़ॉल्ट नेटवर्क बन जाता है, तो ऐप्लिकेशन को नए नेटवर्क के लिए onAvailable(Network) कॉल मिलता है. कनेक्टिविटी में होने वाले बदलावों के हिसाब से काम करने के लिए, onCapabilitiesChanged(Network,NetworkCapabilities), onLinkPropertiesChanged(Network,LinkProperties) या दोनों को लागू करें.
registerDefaultNetworkCallback() के साथ रजिस्टर किए गए कॉल बैक के लिए, onLost() का मतलब है कि नेटवर्क अब डिफ़ॉल्ट नेटवर्क नहीं है. ऐसा हो सकता है कि वह डिसकनेक्ट हो गया हो.
डिफ़ॉल्ट नेटवर्क के इस्तेमाल किए जा रहे ट्रांसपोर्ट के बारे में जानने के लिए, NetworkCapabilities.hasTransport(int) को क्वेरी किया जा सकता है. हालांकि, यह नेटवर्क के बैंडविड्थ या मीटर वाले नेटवर्क के लिए अच्छा प्रॉक्सी नहीं है. आपका ऐप्लिकेशन यह नहीं मान सकता कि वाई-फ़ाई हमेशा अनमीटर्ड होता है और मोबाइल डेटा की तुलना में हमेशा बेहतर बैंडविड्थ देता है.
इसके बजाय, बैंडविड्थ को मेज़र करने के लिए NetworkCapabilities.getLinkDownstreamBandwidthKbps() का इस्तेमाल करें. साथ ही, मीटर किए गए नेटवर्क का पता लगाने के लिए NetworkCapabilites.hasCapability(int) के साथ NET_CAPABILITY_NOT_METERED आर्ग्युमेंट का इस्तेमाल करें. ज़्यादा जानकारी के लिए, NetworkCapabilities और LinkProperties के बारे में सेक्शन देखें.
डिफ़ॉल्ट रूप से, कॉलबैक के तरीकों को आपके ऐप्लिकेशन के कनेक्टिविटी थ्रेड पर कॉल किया जाता है. यह एक अलग थ्रेड है, जिसका इस्तेमाल ConnectivityManager करता है. अगर आपको कॉलबैक लागू करने के लिए ज़्यादा समय चाहिए, तो ConnectivityManager.registerDefaultNetworkCallback(NetworkCallback, Handler) वैरिएंट का इस्तेमाल करके, उन्हें अलग वर्कर थ्रेड पर कॉल करें.
जब आपको कॉलबैक की ज़रूरत न हो, तब ConnectivityManager.unregisterNetworkCallback(NetworkCallback) पर कॉल करके, कॉलबैक की सुविधा के लिए किया गया रजिस्ट्रेशन रद्द करें.
इसके लिए, अपनी मुख्य गतिविधि के onPause() का इस्तेमाल करें. खास तौर पर, तब जब आपने कॉलबैक को onResume() में रजिस्टर किया हो.
अन्य नेटवर्क (ऐडवांस इस्तेमाल के उदाहरण)
ज़्यादातर ऐप्लिकेशन के लिए, डिफ़ॉल्ट नेटवर्क ही काम का नेटवर्क होता है. हालांकि, कुछ ऐप्लिकेशन को अन्य उपलब्ध नेटवर्क में दिलचस्पी हो सकती है. इनके बारे में जानने के लिए, ऐप्लिकेशन अपनी ज़रूरतों के हिसाब से NetworkRequest बनाते हैं और ConnectivityManager.registerNetworkCallback(NetworkRequest, NetworkCallback) को कॉल करते हैं.
यह प्रोसेस, डिफ़ॉल्ट नेटवर्क पर सुनने जैसी ही होती है. हालांकि, किसी भी समय किसी ऐप्लिकेशन पर सिर्फ़ एक डिफ़ॉल्ट नेटवर्क लागू हो सकता है. इस वर्शन की मदद से, आपका ऐप्लिकेशन एक साथ सभी उपलब्ध नेटवर्क देख सकता है. इसलिए, onLost(Network) को कॉल करने का मतलब है कि नेटवर्क हमेशा के लिए डिसकनेक्ट हो गया है. इसका मतलब यह नहीं है कि यह अब डिफ़ॉल्ट नेटवर्क नहीं है.
ऐप्लिकेशन, NetworkRequest बनाता है, ताकि ConnectivityManager को यह पता चल सके कि उसे किस तरह के नेटवर्क से कनेक्ट करना है. यहां दिए गए उदाहरण में, ऐसे ऐप्लिकेशन के लिए NetworkRequest बनाने का तरीका बताया गया है जिसे सिर्फ़ बिना शुल्क वाले इंटरनेट कनेक्शन की ज़रूरत होती है:
Kotlin
val request = NetworkRequest.Builder() .addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED) .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) .build() connectivityManager.registerNetworkCallback(request, myNetworkCallback)
Java
NetworkRequest request = new NetworkRequest.Builder() .addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED) .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) .build(); connectivityManager.registerNetworkCallback(request, myNetworkCallback);
इसका मतलब है कि आपका ऐप्लिकेशन, सिस्टम पर किसी भी ऐसे नेटवर्क से जुड़े सभी बदलावों के बारे में सूचनाएं पाता है जिसका इस्तेमाल करने के लिए कोई शुल्क नहीं लिया जाता.
डिफ़ॉल्ट नेटवर्क कॉलबैक के लिए, registerNetworkCallback(NetworkRequest, NetworkCallback, Handler) का एक ऐसा वर्शन है जो Handler स्वीकार करता है. इसलिए, यह आपके ऐप्लिकेशन के Connectivity थ्रेड को लोड नहीं करता है.
कॉल
ConnectivityManager.unregisterNetworkCallback(NetworkCallback)
जब कॉलबैक की सुविधा अब काम की नहीं है. कोई ऐप्लिकेशन एक साथ कई नेटवर्क कॉलबैक रजिस्टर कर सकता है.
सुविधा के लिए, NetworkRequest ऑब्जेक्ट में वे सामान्य सुविधाएं शामिल होती हैं जिनकी ज़रूरत ज़्यादातर ऐप्लिकेशन को होती है. इनमें ये सुविधाएं शामिल हैं:
ऐप्लिकेशन लिखते समय, डिफ़ॉल्ट सेटिंग देखें. इससे आपको पता चलेगा कि ये सेटिंग आपके इस्तेमाल के उदाहरण से मेल खाती हैं या नहीं. अगर आपको अपने ऐप्लिकेशन को उन नेटवर्क के बारे में सूचना देनी है जिनमें ये सुविधाएं नहीं हैं, तो इन सेटिंग को मिटा दें. दूसरी ओर, उन नेटवर्क में कनेक्टिविटी से जुड़े किसी भी बदलाव के लिए कॉल किए जाने से बचने के लिए, सुविधाएं जोड़ें जिनसे आपका ऐप्लिकेशन इंटरैक्ट नहीं करता है.
उदाहरण के लिए, अगर आपके ऐप्लिकेशन को मल्टीमीडिया मैसेज (एमएमएस) भेजने हैं, तो NetworkRequest में NET_CAPABILITY_MMS जोड़ें. इससे आपको उन सभी नेटवर्क के बारे में सूचना नहीं मिलेगी जो मल्टीमीडिया मैसेज (एमएमएस) नहीं भेज सकते. अगर आपका ऐप्लिकेशन सिर्फ़ P2P वाई-फ़ाई कनेक्टिविटी में दिलचस्पी रखता है, तो
TRANSPORT_WIFI_AWARE
जोड़ें.
अगर आपको इंटरनेट पर किसी सर्वर के साथ डेटा ट्रांसफ़र करने की सुविधा चाहिए, तो NET_CAPABILITY_INTERNET और NET_CAPABILITY_VALIDATED आपके लिए मददगार हैं.
कॉलबैक के क्रम का उदाहरण
इस सेक्शन में, कॉलबैक के उस क्रम के बारे में बताया गया है जो किसी ऐप्लिकेशन को मिल सकता है. ऐसा तब होता है, जब वह मोबाइल कनेक्टिविटी वाले डिवाइस पर डिफ़ॉल्ट कॉलबैक और सामान्य कॉलबैक, दोनों को रजिस्टर करता है. इस उदाहरण में, डिवाइस को अच्छे वाई-फ़ाई ऐक्सेस पॉइंट से कनेक्ट किया गया है. इसके बाद, उसे डिसकनेक्ट कर दिया गया है. इस उदाहरण में यह भी माना गया है कि डिवाइस पर मोबाइल डेटा हमेशा चालू रखें सेटिंग चालू है.
टाइमलाइन यहां दी गई है:
जब ऐप्लिकेशन
registerNetworkCallback()को कॉल करता है, तो कॉलबैक को मोबाइल नेटवर्क के लिएonAvailable(),onNetworkCapabilitiesChanged(), औरonLinkPropertiesChanged()से तुरंत कॉल मिलते हैं, क्योंकि सिर्फ़ वही नेटवर्क उपलब्ध होता है. अगर कोई दूसरा नेटवर्क उपलब्ध है, तो ऐप्लिकेशन को उस नेटवर्क के लिए भी कॉलबैक मिलते हैं.
पहली इमेज.registerNetworkCallback()को कॉल करने के बाद ऐप्लिकेशन की स्थिति.इसके बाद, ऐप्लिकेशन
registerDefaultNetworkCallback()को कॉल करता है. मोबाइल नेटवर्क के लिए, डिफ़ॉल्ट नेटवर्क कॉलबैक कोonAvailable(),onNetworkCapabilitiesChanged(), औरonLinkPropertiesChanged()पर कॉल मिलने लगते हैं. ऐसा इसलिए होता है, क्योंकि मोबाइल नेटवर्क डिफ़ॉल्ट नेटवर्क होता है. अगर कोई दूसरा नेटवर्क चालू है, तो ऐप्लिकेशन को उस नेटवर्क पर कॉल नहीं मिल सकते.
दूसरी इमेज. डिफ़ॉल्ट नेटवर्क रजिस्टर करने के बाद ऐप्लिकेशन की स्थिति.इसके बाद, डिवाइस को ऐसे वाई-फ़ाई नेटवर्क से कनेक्ट किया जाता है जिसमें डेटा इस्तेमाल करने की कोई सीमा नहीं होती. नियमित नेटवर्क कॉलबैक, वाई-फ़ाई नेटवर्क के लिए
onAvailable(),onNetworkCapabilitiesChanged(), औरonLinkPropertiesChanged()पर कॉल पाता है.
तीसरी इमेज. बिना शुल्क वाले वाई-फ़ाई नेटवर्क से कनेक्ट होने के बाद ऐप्लिकेशन की स्थिति.इस समय, ऐसा हो सकता है कि वाई-फ़ाई नेटवर्क को पुष्टि करने में कुछ समय लगे. इस मामले में,
onNetworkCapabilitiesChanged()के सामान्य नेटवर्क कॉलबैक के लिए किए गए कॉल में, क्षमताNET_CAPABILITY_VALIDATEDशामिल नहीं होती. कुछ समय बाद, इसेonNetworkCapabilitiesChanged()पर कॉल मिलता है. इसमें नई सुविधाओं के तौर परNET_CAPABILITY_VALIDATEDशामिल है. ज़्यादातर मामलों में, पुष्टि बहुत कम समय में हो जाती है.जब वाई-फ़ाई नेटवर्क की पुष्टि हो जाती है, तो सिस्टम इसे मोबाइल नेटवर्क से ज़्यादा प्राथमिकता देता है. इसकी मुख्य वजह यह है कि वाई-फ़ाई नेटवर्क में डेटा की कोई सीमा नहीं होती. वाई-फ़ाई नेटवर्क डिफ़ॉल्ट नेटवर्क बन जाता है. इसलिए, डिफ़ॉल्ट नेटवर्क कॉलबैक को वाई-फ़ाई नेटवर्क के लिए
onAvailable(),onNetworkCapabilitiesChanged(), औरonLinkPropertiesChanged()पर कॉल मिलता है. मोबाइल नेटवर्क बैकग्राउंड में चला जाता है. इसके बाद, रेगुलर नेटवर्क कॉलबैक को मोबाइल नेटवर्क के लिएonLosing()पर कॉल मिलता है.इस उदाहरण में यह माना गया है कि इस डिवाइस के लिए मोबाइल डेटा हमेशा चालू रहता है. इसलिए, मोबाइल नेटवर्क कभी डिसकनेक्ट नहीं होता. अगर यह सेटिंग बंद है, तो कुछ समय बाद मोबाइल नेटवर्क डिसकनेक्ट हो जाता है. इसके बाद, रेगुलर नेटवर्क कॉलबैक को
onLost()पर कॉल मिलता है.
चौथी इमेज. वाई-फ़ाई नेटवर्क की पुष्टि हो जाने के बाद, ऐप्लिकेशन की स्थिति.इसके बाद, डिवाइस वाई-फ़ाई से अचानक डिसकनेक्ट हो जाता है, क्योंकि वह रेंज से बाहर चला जाता है. वाई-फ़ाई डिसकनेक्ट होने की वजह से, रेगुलर नेटवर्क कॉलबैक को वाई-फ़ाई के लिए
onLost()पर कॉल मिलता है. मोबाइल नेटवर्क को नया डिफ़ॉल्ट नेटवर्क बनाया गया है. इसलिए, डिफ़ॉल्ट नेटवर्क कॉलबैक को मोबाइल नेटवर्क के लिएonAvailable(),onNetworkCapabilitiesChanged(), औरonLinkPropertiesChanged()पर कॉल मिलते हैं.
पांचवीं इमेज. वाई-फ़ाई नेटवर्क से डिसकनेक्ट होने के बाद ऐप्लिकेशन की स्थिति.
अगर मोबाइल डेटा हमेशा चालू रखें सेटिंग बंद है, तो वाई-फ़ाई डिसकनेक्ट होने पर डिवाइस, मोबाइल नेटवर्क से फिर से कनेक्ट होने की कोशिश करता है. तस्वीर मिलती-जुलती है, लेकिन onAvailable() कॉल के लिए कुछ समय बाद मिलती है. साथ ही, रेगुलर नेटवर्क कॉलबैक को भी onAvailable(), onNetworkCapabilitiesChanged(), और onLinkPropertiesChanged() पर कॉल मिलते हैं, क्योंकि मोबाइल उपलब्ध हो जाता है.
डेटा ट्रांसफ़र के लिए नेटवर्क के इस्तेमाल पर पाबंदियां
नेटवर्क कॉलबैक वाले नेटवर्क को देखने का मतलब यह नहीं है कि आपका ऐप्लिकेशन, डेटा ट्रांसफ़र के लिए उस नेटवर्क का इस्तेमाल कर सकता है. कुछ नेटवर्क, इंटरनेट कनेक्टिविटी की सुविधा नहीं देते. साथ ही, कुछ नेटवर्क पर सिर्फ़ खास ऐप्लिकेशन इस्तेमाल किए जा सकते हैं. इंटरनेट कनेक्टिविटी की जांच करने के लिए, NET_CAPABILITY_INTERNET और NET_CAPABILITY_VALIDATED देखें.
बैकग्राउंड में नेटवर्क का इस्तेमाल करने के लिए भी, अनुमति की जांच की जाती है. अगर आपके ऐप्लिकेशन को बैकग्राउंड नेटवर्क का इस्तेमाल करना है, तो उसे CHANGE_NETWORK_STATE अनुमति की ज़रूरत होगी.
इस अनुमति वाले ऐप्लिकेशन, सिस्टम को ऐसे नेटवर्क को चालू करने की कोशिश करने देते हैं जो चालू नहीं है. जैसे, जब डिवाइस किसी वाई-फ़ाई नेटवर्क से कनेक्ट होता है, तब मोबाइल नेटवर्क को चालू करने की कोशिश करना. इस तरह का ऐप्लिकेशन, नेटवर्क चालू होने पर कॉल करने के लिए ConnectivityManager.requestNetwork(NetworkRequest, NetworkCallback) को NetworkCallback के साथ कॉल करता है.