নেটওয়ার্কের অবস্থা পড়ুন

কানেক্টিভিটিতে ডায়নামিক পরিবর্তন সম্পর্কে জানতে Android অ্যাপকে অনুমতি দেয়। কানেক্টিভিটি সংক্রান্ত পরিবর্তন ট্র্যাক করতে ও তার উত্তর দিতে নিম্নলিখিত ক্লাস ব্যবহার করুন:

  • ConnectivityManager সিস্টেমে কানেক্টিভিটির স্ট্যাটাস সম্পর্কে আপনার অ্যাপকে জানায়।
  • Network ক্লাসটি ডিভাইসটি যে নেটওয়ার্কের সাথে কানেক্ট করা আছে তার মধ্যে একটিকে উপস্থাপন করে। আপনি Network অবজেক্টকে কী হিসেবে ব্যবহার করে ConnectivityManager-এর মাধ্যমে নেটওয়ার্ক সম্পর্কে তথ্য সংগ্রহ করতে পারেন অথবা নেটওয়ার্কে সকেট বাইন্ড করতে পারেন। নেটওয়ার্ক ডিসকানেক্ট হয়ে গেলে, Network অবজেক্ট আর ব্যবহার করা যায় না। এমনকি ডিভাইসটি পরে একই অ্যাপ্লায়েন্সের সাথে আবার কানেক্ট করলেও, একটি নতুন Network অবজেক্ট নতুন নেটওয়ার্ককে দেখায়।
  • LinkProperties অবজেক্টে কোনও নেটওয়ার্কের লিঙ্কের ব্যাপারে তথ্য থাকে, যেমন DNS সার্ভারের তালিকা, লোকাল IP অ্যাড্রেস এবং নেটওয়ার্কের জন্য ইনস্টল করা নেটওয়ার্ক রুট।
  • NetworkCapabilities অবজেক্টে নেটওয়ার্কের প্রপার্টি সম্পর্কে তথ্য থাকে, যেমন ট্রান্সপোর্ট (ওয়াই-ফাই, মোবাইল, ব্লুটুথ) এবং নেটওয়ার্ক কী করতে পারে। যেমন, নেটওয়ার্কটি এমএমএস পাঠাতে সক্ষম কিনা, ক্যাপটিভ পোর্টালের পিছনে আছে কিনা বা মিটার করা কিনা তা নির্ধারণ করতে আপনি অবজেক্টটি কোয়েরি করতে পারেন।

যেসব অ্যাপ যেকোনও সময়ে কানেক্টিভিটির তাৎক্ষণিক অবস্থা জানতে চায়, সেগুলি ConnectivityManager মেথড কল করে কী ধরনের নেটওয়ার্ক উপলভ্য আছে তা জানতে পারে। এই পদ্ধতিগুলি ডিবাগ করার জন্য এবং যেকোনও নির্দিষ্ট সময়ে উপলভ্য কানেক্টিভিটির স্ন্যাপশট মাঝে মাঝে পর্যালোচনা করার জন্য সহায়ক।

তবে, সিঙ্ক্রোনাস ConnectivityManager পদ্ধতি আপনার অ্যাপকে কল করার পরে কী ঘটছে সে সম্পর্কে কিছু বলে না, তাই তারা আপনাকে UI আপডেট করতে দেয় না। এছাড়াও, নেটওয়ার্ক ডিসকানেক্ট হয়ে গেলে বা নেটওয়ার্কের ক্ষমতা পরিবর্তন হলে, তারা অ্যাপের আচরণ অ্যাডজাস্ট করতে পারবেন না।

কানেক্টিভিটি যেকোনও সময় পরিবর্তন হতে পারে এবং বেশিরভাগ অ্যাপের ক্ষেত্রে ডিভাইসে নেটওয়ার্কিংয়ের স্ট্যাটাস সবসময় ফ্রেশ, আপ-টু-ডেট ভিউ থাকা প্রয়োজন। অ্যাপের জন্য গুরুত্বপূর্ণ পরিবর্তন সম্পর্কে সতর্ক হতে, অ্যাপ ConnectivityManager-এর সাথে কলব্যাক রেজিস্টার করতে পারে। কলব্যাক ব্যবহার করে, আপনার অ্যাপ কানেক্টিভিটিতে যেকোনও প্রাসঙ্গিক পরিবর্তনের সাথে সাথে প্রতিক্রিয়া জানাতে পারে, যার ফলে দ্রুত আপডেট মিস করতে পারে এমন ব্যয়বহুল পোলিংয়ের আশ্রয় নিতে হয় না।

NetworkCallback এবং ডিভাইসের কানেক্টিভিটি স্ট্যাটাস জানার অন্যান্য উপায় ব্যবহার করার জন্য কোনও নির্দিষ্ট অনুমতির প্রয়োজন হয় না। তবে, কিছু নেটওয়ার্কের ক্ষেত্রে নির্দিষ্ট অনুমতি প্রয়োজন হয়। যেমন, অ্যাপের জন্য উপলভ্য নয় এমন সীমাবদ্ধ নেটওয়ার্ক থাকতে পারে। ব্যাকগ্রাউন্ড নেটওয়ার্কের সাথে বাইন্ড করার জন্য CHANGE_NETWORK_STATE অনুমতি প্রয়োজন। এবং কিছু কল চালানোর জন্য নির্দিষ্ট অনুমতির প্রয়োজন হতে পারে। বিস্তারিত জানতে প্রতিটি কলের জন্য নির্দিষ্ট ডকুমেন্টেশন দেখুন।

তাৎক্ষণিক অবস্থা পান

Android-পরিচালিত ডিভাইস একই সময়ে একাধিক কানেকশন বজায় রাখতে পারে। বর্তমান নেটওয়ার্ক স্ট্যাটাস সম্পর্কে তথ্য পেতে, প্রথমে ConnectivityManager-এর ইনস্ট্যান্স পান:

Kotlin

val connectivityManager = getSystemService(ConnectivityManager::class.java)

জাভা

ConnectivityManager connectivityManager = getSystemService(ConnectivityManager.class);

এরপর, আপনার অ্যাপের জন্য বর্তমান ডিফল্ট নেটওয়ার্কের রেফারেন্স পেতে এই ইনস্ট্যান্স ব্যবহার করুন:

Kotlin

val currentNetwork = connectivityManager.getActiveNetwork()

জাভা

Network currentNetwork = connectivityManager.getActiveNetwork();

কোনও নেটওয়ার্কের রেফারেন্স সহ, আপনার অ্যাপ এই বিষয়ে তথ্য অনুরোধ করতে পারে:

Kotlin

val caps = connectivityManager.getNetworkCapabilities(currentNetwork)
val linkProperties = connectivityManager.getLinkProperties(currentNetwork)

জাভা

NetworkCapabilities caps = connectivityManager.getNetworkCapabilities(currentNetwork);
LinkProperties linkProperties = connectivityManager.getLinkProperties(currentNetwork);

আরও উপযোগী কার্যকারিতার জন্য, একটি NetworkCallback রেজিস্টার করুন। নেটওয়ার্ক কলব্যাক রেজিস্টার করার ব্যাপারে আরও তথ্যের জন্য, নেটওয়ার্ক ইভেন্ট শুনুন দেখুন।

NetworkCapabilities এবং LinkProperties

NetworkCapabilities এবং LinkProperties অবজেক্ট, সিস্টেম কোনও নেটওয়ার্ক সম্পর্কে যেসব অ্যাট্রিবিউট জানে, সেগুলি সম্পর্কে তথ্য প্রদান করে।

LinkProperties অবজেক্ট রুট, লিঙ্ক অ্যাড্রেস, ইন্টারফেসের নাম, প্রক্সি তথ্য (যদি থাকে) এবং DNS সার্ভার সম্পর্কে জানে। আপনার প্রয়োজনীয় তথ্য পেতে LinkProperties অবজেক্টে প্রাসঙ্গিক পদ্ধতি কল করুন।

NetworkCapabilities অবজেক্ট নেটওয়ার্ক ট্রান্সপোর্ট এবং সেগুলির ক্ষমতা সম্পর্কে তথ্য এনক্যাপসুলেট করে।

ট্রান্সপোর্ট হল একটি ফিজিক্যাল মিডিয়ামের অ্যাবস্ট্রাকশন যার মাধ্যমে নেটওয়ার্ক কাজ করে। ট্রান্সপোর্টের সাধারণ উদাহরণ হল ইথারনেট, ওয়াই-ফাই ও মোবাইল। VPN ও পিয়ার-টু-পিয়ার ওয়াই-ফাইও ট্রান্সপোর্ট হতে পারে। Android-এ, একটি নেটওয়ার্কে একই সময়ে একাধিক ট্রান্সপোর্ট থাকতে পারে। এর একটি উদাহরণ হল ওয়াই-ফাই ও মোবাইল নেটওয়ার্ক, দুটিতেই VPN অপারেট করা। VPN-এ ওয়াই-ফাই, মোবাইল ও VPN ট্রান্সপোর্ট আছে। কোনও নেটওয়ার্কে নির্দিষ্ট কোনও ট্রান্সপোর্ট আছে কিনা তা জানতে, NetworkCapabilities.TRANSPORT_* কনস্ট্যান্টের মধ্যে কোনও একটির সাথে NetworkCapabilities.hasTransport(int) মেথড ব্যবহার করুন।

নেটওয়ার্কের প্রপার্টি বর্ণনা করে এমন ক্ষমতা। উদাহরণস্বরূপ, এর মধ্যে MMS, NOT_METERED ও INTERNET অন্তর্ভুক্ত। MMS-এর সুবিধা আছে এমন নেটওয়ার্ক মাল্টিমিডিয়া মেসেজিং পরিষেবা মেসেজ পাঠাতে ও পেতে পারে এবং এই সুবিধা নেই এমন নেটওয়ার্ক তা পারে না। 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: এটি দেখায় যে নেটওয়ার্কটি প্রোব করার সময় পাবলিক ইন্টারনেটে প্রকৃত অ্যাক্সেস প্রদান করে। ক্যাপটিভ পোর্টালের পিছনে থাকা নেটওয়ার্ক বা ডোমেন নেম রেজোলিউশন প্রদান করে না এমন নেটওয়ার্কের এই ক্ষমতা নেই। কোনও নেটওয়ার্ক অ্যাক্সেস প্রদান করছে কিনা সেই সম্পর্কে সিস্টেমের পক্ষে এর থেকে বেশি কিছু বলা সম্ভব নয়, যদিও নীতিগতভাবে, যাচাই করা নেটওয়ার্কও IP-ভিত্তিক ফিল্টারিংয়ের অধীন হতে পারে অথবা দুর্বল সিগন্যালের মতো সমস্যার কারণে হঠাৎ কানেক্টিভিটি হারিয়ে যেতে পারে।

  • NET_CAPABILITY_CAPTIVE_PORTAL: এটি ইঙ্গিত করে যে নেটওয়ার্কটি প্রোব করার সময় সেটিতে একটি ক্যাপটিভ পোর্টাল আছে।

আরও কিছু ক্ষমতা আছে যেগুলি আরও বিশেষায়িত অ্যাপের জন্য উপযোগী হতে পারে। আরও তথ্যের জন্য, NetworkCapabilities.hasCapability(int)-এ প্যারামিটারের সংজ্ঞা পড়ুন।

নেটওয়ার্কের ক্ষমতা যেকোনও সময় পরিবর্তন হতে পারে। সিস্টেম কোনও অন্তরীণ পোর্টাল শনাক্ত করলে, এটি ব্যবহারকারীকে লগ-ইন করার জন্য আমন্ত্রণ জানিয়ে একটি বিজ্ঞপ্তি দেখায়। এটি চলাকালীন, নেটওয়ার্কে NET_CAPABILITY_INTERNET ও NET_CAPABILITY_CAPTIVE_PORTAL ক্ষমতা থাকলেও NET_CAPABILITY_VALIDATED ক্ষমতা নেই।

ব্যবহারকারী অ্যাকশন নিয়ে ক্যাপটিভ পোর্টাল পৃষ্ঠায় লগ-ইন করলে, ডিভাইসটি সর্বজনীন ইন্টারনেট অ্যাক্সেস করতে পারে এবং নেটওয়ার্ক NET_CAPABILITY_VALIDATED ক্ষমতা অর্জন করে ও NET_CAPABILITY_CAPTIVE_PORTAL ক্ষমতা হারায়।

একইভাবে, নেটওয়ার্কের ট্রান্সপোর্ট ডায়নামিক্যালি পরিবর্তন হতে পারে। যেমন, VPN নিজেকে এমনভাবে রিকনফিগার করতে পারে যাতে এটি সদ্য চালু হওয়া কোনও দ্রুত নেটওয়ার্ক ব্যবহার করতে পারে, যেমন মোবাইল থেকে ওয়াই-ফাইতে সুইচ করা। এই ক্ষেত্রে, নেটওয়ার্ক TRANSPORT_CELLULAR ট্রান্সপোর্ট হারিয়ে ফেলে এবং TRANSPORT_WIFI ট্রান্সপোর্ট পেয়ে যায়, যেখানে TRANSPORT_VPN ট্রান্সপোর্ট বজায় থাকে।

নেটওয়ার্ক ইভেন্ট শুনুন

নেটওয়ার্ক ইভেন্ট সম্পর্কে জানতে, ConnectivityManager.registerDefaultNetworkCallback(NetworkCallback) এবং ConnectivityManager.registerNetworkCallback(NetworkCallback)-এর সাথে 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)
    }
})

জাভা

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)

জাভা

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 অবজেক্টে অধিকাংশ অ্যাপের প্রয়োজনীয় সাধারণ ক্ষমতা থাকে, যার মধ্যে নিম্নলিখিতগুলি অন্তর্ভুক্ত:

আপনার অ্যাপ লেখার সময়, ডিফল্ট সেটিংস আপনার ব্যবহারের ক্ষেত্রের সাথে মিলছে কিনা তা চেক করুন এবং আপনার অ্যাপকে যদি এমন নেটওয়ার্ক সম্পর্কে বিজ্ঞপ্তি পাঠাতে চান যেগুলির এই ক্ষমতা নেই, তাহলে সেগুলি মুছে দিন। অন্যদিকে, আপনার অ্যাপ ইন্টার‍্যাক্ট করে না এমন নেটওয়ার্কে কানেক্টিভিটি সংক্রান্ত কোনও পরিবর্তনের জন্য কল করা এড়াতে ক্যাপাবিলিটি যোগ করুন।

যেমন, আপনার অ্যাপকে MMS মেসেজ পাঠাতে হলে, NetworkRequest-এ NET_CAPABILITY_MMS যোগ করুন যাতে 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 কল করা হয়।