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

অ্যান্ড্রয়েড অ্যাপগুলিকে কানেক্টিভিটির গতিশীল পরিবর্তন সম্পর্কে জানতে সক্ষম করে। কানেক্টিভিটির পরিবর্তনগুলি ট্র্যাক করতে এবং সে অনুযায়ী সাড়া দিতে নিম্নলিখিত ক্লাসগুলি ব্যবহার করুন:

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

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

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

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

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

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

একটি অ্যান্ড্রয়েড-চালিত ডিভাইস একই সময়ে অনেক সংযোগ বজায় রাখতে পারে। বর্তমান নেটওয়ার্ক অবস্থা সম্পর্কে তথ্য পেতে, প্রথমে ConnectivityManager এর একটি ইনস্ট্যান্স সংগ্রহ করুন:

কোটলিন

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

জাভা

ConnectivityManager connectivityManager = getSystemService(ConnectivityManager.class);

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

কোটলিন

val currentNetwork = connectivityManager.getActiveNetwork()

জাভা

Network currentNetwork = connectivityManager.getActiveNetwork();

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

কোটলিন

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

জাভা

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

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

নেটওয়ার্ক ক্ষমতা এবং লিঙ্ক বৈশিষ্ট্য

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

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

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

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

ক্যাপাবিলিটি নেটওয়ার্কের একটি বৈশিষ্ট্য বর্ণনা করে। উদাহরণস্বরূপ ক্যাপাবিলিটিগুলোর মধ্যে রয়েছে MMS , NOT_METERED এবং INTERNET । MMS ক্যাপাবিলিটি সম্পন্ন একটি নেটওয়ার্ক মাল্টিমিডিয়া মেসেজিং সার্ভিস (MMS) বার্তা পাঠাতে ও গ্রহণ করতে পারে, এবং এই ক্যাপাবিলিটি ছাড়া একটি নেটওয়ার্ক তা পারে না। NOT_METERED ক্যাপাবিলিটি সম্পন্ন একটি নেটওয়ার্ক ডেটার জন্য ব্যবহারকারীর কাছ থেকে বিল নেয় না। আপনার অ্যাপ NetworkCapabilities.hasCapability(int) মেথডটি এবং NetworkCapabilities.NET_CAPABILITY_* কনস্ট্যান্টগুলোর যেকোনো একটি ব্যবহার করে উপযুক্ত ক্যাপাবিলিটিগুলো পরীক্ষা করতে পারে।

সবচেয়ে দরকারি NET_CAPABILITY_* কনস্ট্যান্টগুলো হলো:

  • NET_CAPABILITY_INTERNET : এটি নির্দেশ করে যে নেটওয়ার্কটি ইন্টারনেট অ্যাক্সেস করার জন্য সেট আপ করা হয়েছে। এটি সেটআপ সম্পর্কিত, পাবলিক সার্ভারে পৌঁছানোর প্রকৃত ক্ষমতা সম্পর্কিত নয়। উদাহরণস্বরূপ, একটি নেটওয়ার্ক ইন্টারনেট অ্যাক্সেস করার জন্য সেট আপ করা যেতে পারে, কিন্তু সেটি একটি ক্যাপটিভ পোর্টালের অধীনও থাকতে পারে।

    একটি ক্যারিয়ারের মোবাইল নেটওয়ার্কে সাধারণত INTERNET সক্ষমতা থাকে, কিন্তু একটি স্থানীয় পি২পি ওয়াই-ফাই নেটওয়ার্কে সাধারণত তা থাকে না। প্রকৃত কানেক্টিভিটির জন্য, 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) ব্যবহার করুন। এই দুটি মেথড ভিন্ন ভিন্ন উদ্দেশ্যে কাজ করে।

সমস্ত অ্যান্ড্রয়েড অ্যাপের একটি ডিফল্ট নেটওয়ার্ক থাকে, যা সিস্টেম দ্বারা নির্ধারিত হয়। সিস্টেম সাধারণত মিটারড নেটওয়ার্কের চেয়ে আনমিটারড নেটওয়ার্ক এবং ধীরগতির নেটওয়ার্কের চেয়ে দ্রুতগতির নেটওয়ার্ককে বেশি পছন্দ করে।

যখন কোনো অ্যাপ HttpsURLConnection এর মতো কোনো নেটওয়ার্ক অনুরোধ পাঠায়, তখন সিস্টেম ডিফল্ট নেটওয়ার্ক ব্যবহার করে সেই অনুরোধটি পূরণ করে। অ্যাপগুলো অন্যান্য নেটওয়ার্কেও ট্র্যাফিক পাঠাতে পারে। আরও তথ্যের জন্য, অতিরিক্ত নেটওয়ার্ক সম্পর্কিত বিভাগটি দেখুন।

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

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

কোটলিন

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) কল করার অর্থ হলো নেটওয়ার্কটি স্থায়ীভাবে সংযোগ বিচ্ছিন্ন হয়ে গেছে, এর মানে এই নয় যে এটি আর ডিফল্ট নয়।

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

কোটলিন

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 মেসেজ পাঠানোর প্রয়োজন হয়, তাহলে NetworkRequestNET_CAPABILITY_MMS যোগ করুন, যাতে MMS মেসেজ পাঠাতে পারে না এমন সমস্ত নেটওয়ার্কের তথ্য আপনাকে জানানো না হয়। যদি আপনার অ্যাপ শুধুমাত্র P2P Wi-Fi কানেক্টিভিটিতে আগ্রহী হয়, তাহলে TRANSPORT_WIFI_AWARE যোগ করুন। যদি আপনি ইন্টারনেটে থাকা কোনো সার্ভারের সাথে ডেটা ট্রান্সফার করার ক্ষমতায় আগ্রহী হন, তাহলে NET_CAPABILITY_INTERNET এবং NET_CAPABILITY_VALIDATED সহায়ক হবে।

নমুনা কলব্যাক ক্রম

এই বিভাগে বর্ণনা করা হয়েছে যে, মোবাইল সংযোগ আছে এমন কোনো ডিভাইসে একটি অ্যাপ যদি একটি ডিফল্ট কলব্যাক এবং একটি সাধারণ কলব্যাক উভয়ই রেজিস্টার করে, তাহলে অ্যাপটি কোন কোন কলব্যাকের ক্রম পেতে পারে। এই উদাহরণে, ডিভাইসটি একটি ভালো ওয়াই-ফাই অ্যাক্সেস পয়েন্টের সাথে সংযুক্ত হয়, তারপর সেখান থেকে সংযোগ বিচ্ছিন্ন করে। উদাহরণটিতে আরও ধরে নেওয়া হয়েছে যে ডিভাইসটিতে ‘মোবাইল ডেটা সর্বদা চালু’ (Mobile data always on) সেটিংটি সক্রিয় করা আছে।

সময়রেখাটি নিম্নরূপ:

  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 থাকে যা নেটওয়ার্কটি চালু হলে কল করা হবে।