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

Android, ऐप्लिकेशन को कनेक्टिविटी में होने वाले डाइनैमिक बदलावों के बारे में जानने की सुविधा देता है. कनेक्टिविटी में होने वाले बदलावों को ट्रैक करने और उनका जवाब देने के लिए, इन क्लास का इस्तेमाल करें:

  • ConnectivityManager आपके ऐप्लिकेशन को सिस्टम में कनेक्टिविटी की स्थिति के बारे में बताता है.
  • Network क्लास, उन नेटवर्क में से किसी एक को दिखाता है जिनसे डिवाइस कनेक्ट है. Network ऑब्जेक्ट का इस्तेमाल, नेटवर्क के बारे में जानकारी इकट्ठा करने के लिए किया जा सकता है. इसके लिए, ConnectivityManager को कुंजी के तौर पर इस्तेमाल करें. इसके अलावा, इसका इस्तेमाल नेटवर्क पर सॉकेट बाइंड करने के लिए भी किया जा सकता है. नेटवर्क डिसकनेक्ट होने पर, Network ऑब्जेक्ट का इस्तेमाल नहीं किया जा सकता. अगर डिवाइस बाद में उसी नेटवर्क से फिर से कनेक्ट हो जाता है, तो भी नया Network ऑब्जेक्ट, नए नेटवर्क को दिखाता है.
  • LinkProperties ऑब्जेक्ट में, नेटवर्क के लिंक के बारे में जानकारी होती है. जैसे, डीएनएस सर्वर की सूची, लोकल आईपी पते, और नेटवर्क के लिए इंस्टॉल किए गए नेटवर्क रूट.
  • NetworkCapabilities ऑब्जेक्ट में नेटवर्क की प्रॉपर्टी के बारे में जानकारी होती है. जैसे, ट्रांसपोर्ट (वाई-फ़ाई, मोबाइल, ब्लूटूथ) और नेटवर्क की क्षमता. उदाहरण के लिए, ऑब्जेक्ट से यह क्वेरी की जा सकती है कि नेटवर्क, एमएमएस भेजने में सक्षम है या नहीं, कैप्टिव पोर्टल के पीछे है या मीटर किया गया है.

जिन ऐप्लिकेशन को किसी भी समय कनेक्टिविटी की मौजूदा स्थिति के बारे में जानना होता है वे ConnectivityManager तरीकों को कॉल कर सकते हैं. इससे उन्हें यह पता चल जाता है कि किस तरह का नेटवर्क उपलब्ध है. ये तरीके, डीबग करने और किसी भी समय उपलब्ध कनेक्टिविटी की समीक्षा करने के लिए मददगार होते हैं.

हालांकि, सिंक्रोनस ConnectivityManager तरीके, कॉल के बाद होने वाली किसी भी गतिविधि के बारे में आपके ऐप्लिकेशन को नहीं बताते. इसलिए, वे आपको यूज़र इंटरफ़ेस (यूआई) अपडेट करने की अनुमति नहीं देते. साथ ही, नेटवर्क के डिसकनेक्ट होने या नेटवर्क की क्षमताओं में बदलाव होने पर, ये ऐप्लिकेशन के व्यवहार में बदलाव नहीं कर सकते.

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

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

Get instantaneous 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 आपके लिए मददगार हो सकते हैं.

कॉलबैक के क्रम का उदाहरण

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

टाइमलाइन यहां दी गई है:

  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 अनुमति की ज़रूरत होगी.

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