नेटवर्क की स्थिति के बारे में जानें

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 ऑब्जेक्ट में, नेटवर्क ट्रांसपोर्ट और उनकी क्षमताओं के बारे में जानकारी होती है.

ट्रांसपोर्ट, किसी फ़िज़िकल मीडियम का एक वर्चुअल वर्शन होता है, जिस पर नेटवर्क काम करता है. ट्रांसपोर्ट के सामान्य उदाहरणों में, ईथरनेट, वाई-फ़ाई, और मोबाइल शामिल हैं. वीपीएन और पीयर-टू-पीयर वाई-फ़ाई भी ट्रांसपोर्ट हो सकते हैं. 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() का इस्तेमाल करें. साथ ही, सीमित डेटा को तय करने के लिए, NET_CAPABILITY_NOT_METERED तर्क के साथ NetworkCapabilites.hasCapability(int) का इस्तेमाल करें. ज़्यादा जानकारी के लिए, 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 जोड़ें. इससे आपको उन सभी नेटवर्क के बारे में जानकारी नहीं मिलेगी जो एमएमएस मैसेज नहीं भेज सकते. अगर आपके ऐप्लिकेशन में सिर्फ़ पी2पी वाई-फ़ाई कनेक्शन की सुविधा चाहिए, तो TRANSPORT_WIFI_AWARE जोड़ें. अगर आपको इंटरनेट पर सर्वर की मदद से डेटा ट्रांसफ़र करना है, तो NET_CAPABILITY_INTERNET और NET_CAPABILITY_VALIDATED आपके लिए मददगार हैं.

कॉलबैक क्रम का सैंपल

इस सेक्शन में, कॉलबैक के क्रम के बारे में बताया गया है. यह क्रम तब दिखता है, जब ऐप्लिकेशन किसी ऐसे डिवाइस पर डिफ़ॉल्ट कॉलबैक और सामान्य कॉलबैक, दोनों रजिस्टर करता है जिसमें मोबाइल कनेक्टिविटी है. इस उदाहरण में, डिवाइस एक अच्छे वाई-फ़ाई ऐक्सेस पॉइंट से कनेक्ट होता है, फिर उससे डिसकनेक्ट हो जाता है. इस उदाहरण में यह भी माना गया है कि डिवाइस पर मोबाइल डेटा हमेशा चालू सेटिंग चालू है.

समयावधि नीचे दी गई है:

  1. जब ऐप्लिकेशन registerNetworkCallback() को कॉल करता है, तो कॉलबैक को मोबाइल नेटवर्क के लिए onAvailable(), onNetworkCapabilitiesChanged(), और onLinkPropertiesChanged() से तुरंत कॉल मिलते हैं, क्योंकि सिर्फ़ वह नेटवर्क उपलब्ध है. अगर कोई दूसरा नेटवर्क उपलब्ध है, तो ऐप्लिकेशन को उस नेटवर्क के लिए भी कॉलबैक मिलते हैं.

    रजिस्टर किए गए नेटवर्क के कॉलबैक इवेंट और इवेंट से ट्रिगर हुए कॉलबैक को दिखाने वाला स्टेट डायग्राम
    पहली इमेज. registerNetworkCallback() को कॉल करने के बाद, ऐप्लिकेशन की स्थिति.

  2. इसके बाद, ऐप्लिकेशन registerDefaultNetworkCallback() को कॉल करता है. डिफ़ॉल्ट नेटवर्क के कॉलबैक को मोबाइल नेटवर्क के लिए, onAvailable(), onNetworkCapabilitiesChanged(), और onLinkPropertiesChanged() पर कॉल मिलना शुरू हो जाता है, क्योंकि मोबाइल नेटवर्क डिफ़ॉल्ट नेटवर्क होता है. अगर कोई ऐसा नेटवर्क चालू है जो डिफ़ॉल्ट नहीं है, तो ऐप्लिकेशन उस नेटवर्क पर कॉल नहीं पाता.

    स्टेटस डायग्राम, डिफ़ॉल्ट नेटवर्क कॉलबैक इवेंट और इवेंट से ट्रिगर होने वाले कॉलबैक को रजिस्टर करता है
    दूसरी इमेज. डिफ़ॉल्ट नेटवर्क को रजिस्टर करने के बाद, ऐप्लिकेशन की स्थिति.

  3. इसके बाद, डिवाइस किसी ऐसे वाई-फ़ाई नेटवर्क से कनेक्ट हो जाता है जिस पर डेटा इस्तेमाल करने के लिए शुल्क नहीं लिया जाता. सामान्य नेटवर्क कॉलबैक में, वाई-फ़ाई नेटवर्क के लिए onAvailable(), onNetworkCapabilitiesChanged(), और onLinkPropertiesChanged() पर कॉल आते हैं.

    ऐप्लिकेशन के किसी नए नेटवर्क से कनेक्ट होने पर ट्रिगर होने वाले कॉलबैक दिखाने वाला स्टेटस डायग्राम
    तीसरी इमेज. बिना शुल्क वाले वाई-फ़ाई नेटवर्क से कनेक्ट करने के बाद, ऐप्लिकेशन की स्थिति.

  4. इस दौरान, हो सकता है कि वाई-फ़ाई नेटवर्क की पुष्टि में कुछ समय लगे. इस मामले में, सामान्य नेटवर्क कॉलबैक के लिए onNetworkCapabilitiesChanged() कॉल में, NET_CAPABILITY_VALIDATED की सुविधा शामिल नहीं होती. कुछ समय बाद, उसे onNetworkCapabilitiesChanged() पर कॉल मिलता है. इसमें नई सुविधाओं में NET_CAPABILITY_VALIDATED शामिल है. ज़्यादातर मामलों में, पुष्टि बहुत जल्दी हो जाती है.

    वाई-फ़ाई नेटवर्क की पुष्टि होने पर, सिस्टम उसे मोबाइल नेटवर्क के मुकाबले प्राथमिकता देता है. ऐसा इसलिए होता है, क्योंकि वाई-फ़ाई नेटवर्क के लिए कोई शुल्क नहीं लिया जाता. वाई-फ़ाई नेटवर्क, डिफ़ॉल्ट नेटवर्क बन जाता है. इसलिए, डिफ़ॉल्ट नेटवर्क कॉलबैक को वाई-फ़ाई नेटवर्क के लिए onAvailable(), onNetworkCapabilitiesChanged(), और onLinkPropertiesChanged() पर कॉल मिलता है. मोबाइल नेटवर्क, बैकग्राउंड में चला जाता है और मोबाइल नेटवर्क के लिए, सामान्य नेटवर्क कॉलबैक को onLosing() पर कॉल मिलता है.

    इस उदाहरण में यह माना गया है कि इस डिवाइस के लिए मोबाइल डेटा हमेशा चालू रहता है. इसलिए, मोबाइल नेटवर्क कभी डिसकनेक्ट नहीं होता. अगर यह सेटिंग बंद है, तो कुछ समय बाद मोबाइल नेटवर्क डिसकनेक्ट हो जाता है और सामान्य नेटवर्क कॉलबैक को onLost() पर एक कॉल मिलता है.

    स्टेटस डायग्राम, जिसमें वाई-फ़ाई नेटवर्क कनेक्शन की पुष्टि होने पर ट्रिगर होने वाले कॉलबैक दिखाए गए हैं
    चौथी इमेज. वाई-फ़ाई नेटवर्क की पुष्टि होने के बाद, ऐप्लिकेशन की स्थिति.

  5. इसके बाद भी, डिवाइस अचानक वाई-फ़ाई से डिसकनेक्ट हो जाता है, क्योंकि वह रींज से बाहर हो जाता है. वाई-फ़ाई डिसकनेक्ट होने की वजह से, सामान्य नेटवर्क कॉलबैक को वाई-फ़ाई के लिए onLost() को कॉल मिलता है. मोबाइल नेटवर्क, डिफ़ॉल्ट नेटवर्क के तौर पर सेट है. इसलिए, डिफ़ॉल्ट नेटवर्क कॉलबैक को मोबाइल नेटवर्क के लिए onAvailable(), onNetworkCapabilitiesChanged(), और onLinkPropertiesChanged() पर कॉल मिलते हैं.

    वाई-फ़ाई नेटवर्क कनेक्शन टूटने पर ट्रिगर होने वाले कॉलबैक दिखाने वाला स्टेटस डायग्राम
    पांचवीं इमेज. वाई-फ़ाई नेटवर्क से डिसकनेक्ट करने के बाद, ऐप्लिकेशन की स्थिति.

अगर मोबाइल डेटा हमेशा चालू रहे सेटिंग बंद है, तो वाई-फ़ाई डिसकनेक्ट होने पर डिवाइस, मोबाइल नेटवर्क से फिर से कनेक्ट होने की कोशिश करता है. तस्वीर एक जैसी है, लेकिन onAvailable() कॉल के लिए थोड़ी और देरी होने से और सामान्य नेटवर्क कॉलबैक में भी onAvailable(), onNetworkCapabilitiesChanged(), और onLinkPropertiesChanged() पर कॉल आएंगे, क्योंकि मोबाइल उपलब्ध हो गया है.

डेटा ट्रांसफ़र के लिए नेटवर्क के इस्तेमाल पर पाबंदियां

नेटवर्क कॉलबैक वाला नेटवर्क देखने का मतलब यह नहीं है कि आपका ऐप्लिकेशन, डेटा ट्रांसफ़र के लिए नेटवर्क का इस्तेमाल कर सकता है. कुछ नेटवर्क, इंटरनेट कनेक्टिविटी की सुविधा नहीं देते. साथ ही, कुछ नेटवर्क पर सिर्फ़ खास ऐप्लिकेशन इस्तेमाल किए जा सकते हैं. इंटरनेट कनेक्टिविटी की जांच करने के लिए, NET_CAPABILITY_INTERNET और NET_CAPABILITY_VALIDATED देखें.

बैकग्राउंड नेटवर्क का इस्तेमाल, अनुमति की जांच पर भी निर्भर करता है. अगर आपका ऐप्लिकेशन बैकग्राउंड नेटवर्क का इस्तेमाल करना चाहता है, तो उसके लिए CHANGE_NETWORK_STATE अनुमति ज़रूरी है.

इस अनुमति वाले ऐप्लिकेशन, सिस्टम को किसी ऐसे नेटवर्क को चालू करने की अनुमति देते हैं जो चालू नहीं है. जैसे, जब डिवाइस किसी वाई-फ़ाई नेटवर्क से कनेक्ट हो, तो मोबाइल नेटवर्क चालू करना. ऐसा ऐप्लिकेशन, NetworkCallback के साथ ConnectivityManager.requestNetwork(NetworkRequest, NetworkCallback) को कॉल करता है, ताकि नेटवर्क चालू होने पर उसे कॉल किया जा सके.