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

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.hasTransport(int) तरीके का इस्तेमाल करें.NetworkCapabilities.TRANSPORT_*

क्षमता, नेटवर्क की किसी प्रॉपर्टी के बारे में बताती है. क्षमता के उदाहरणों में, MMS, NOT_METERED, और INTERNET शामिल हैं. एमएमएस की सुविधा वाला नेटवर्क, मल्टीमीडिया मैसेजिंग सेवा के मैसेज भेज और पा सकता है. वहीं, इस सुविधा के बिना वाला नेटवर्क ऐसा नहीं कर सकता. NOT_METERED की सुविधा वाला नेटवर्क, डेटा के लिए उपयोगकर्ता से शुल्क नहीं लेता. आपका ऐप्लिकेशन, NetworkCapabilities.NET_CAPABILITY_* कॉन्स्टैंट में से किसी एक के साथ NetworkCapabilities.hasCapability(int) तरीके का इस्तेमाल करके, सही क्षमताओं की जांच कर सकता है.

NET_CAPABILITY_* के सबसे काम के कॉन्स्टैंट में ये शामिल हैं:

  • NET_CAPABILITY_INTERNET: इससे पता चलता है कि नेटवर्क को इंटरनेट ऐक्सेस करने के लिए सेट अप किया गया है. यह सेटअप के बारे में है, न कि सार्वजनिक सर्वर तक पहुंचने की असल क्षमता के बारे में. उदाहरण के लिए, किसी नेटवर्क को इंटरनेट ऐक्सेस करने के लिए सेट अप किया जा सकता है, लेकिन वह कैप्टिव पोर्टल के तहत हो सकता है.

    मोबाइल और इंटरनेट सेवा देने वाली कंपनी के मोबाइल नेटवर्क में आम तौर पर INTERNET की सुविधा होती है. वहीं, लोकल पी2पी वाई-फ़ाई नेटवर्क में आम तौर पर यह सुविधा नहीं होती. असल कनेक्टिविटी के लिए, 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) पर कॉल का मतलब है कि नेटवर्क हमेशा के लिए डिसकनेक्ट हो गया है. इसका मतलब यह नहीं है कि वह अब डिफ़ॉल्ट नहीं है.

ऐप्लिकेशन, ConnectivityManager को यह बताने के लिए NetworkRequest बनाता है कि उसे किस तरह के नेटवर्क को सुनना है. यहां दिए गए उदाहरण में, ऐसे ऐप्लिकेशन के लिए 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). कोई ऐप्लिकेशन, एक साथ कई नेटवर्क कॉलबैक रजिस्टर कर सकता है.

सुविधा के लिए, the NetworkRequest ऑब्जेक्ट में the सामान्य सुविधाएं शामिल होती हैं जिनकी ज़रूरत ज़्यादातर ऐप्लिकेशन को होती है. इनमें ये शामिल हैं:

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

उदाहरण के लिए, अगर आपके ऐप्लिकेशन को एमएमएस मैसेज भेजने हैं, तो NET_CAPABILITY_MMS को NetworkRequest में जोड़ें, ताकि आपको उन सभी नेटवर्क के बारे में न बताया जाए जो एमएमएस मैसेज नहीं भेज सकते. अगर आपके ऐप्लिकेशन की दिलचस्पी सिर्फ़ पी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 अनुमति की ज़रूरत होती है.

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