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

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