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.hasTransport(int) तरीके का इस्तेमाल करें. इसके लिए, NetworkCapabilities.TRANSPORT_* कॉन्स्टेंट में से किसी एक का इस्तेमाल करें.
नेटवर्क की किसी प्रॉपर्टी के बारे में बताने वाली सुविधा. उदाहरण के लिए, 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 का इस्तेमाल करता है.