Connectivity Manager: এটি কী, পদ্ধতি এবং সংযোগ মনিটরিং

লেখক: IT Sectr প্রকাশিত: 2026-03-10 পড়ার সময়: 9 মিনিট

Connectivity Manager হল একটি Android সিস্টেম সার্ভিস যা অ্যাপ্লিকেশনগুলিকে ডিভাইসের নেটওয়ার্ক সংযোগের অবস্থা সম্পর্কে তথ্য প্রদান করে। এটি ইন্টারনেটের উপলব্ধতা পরীক্ষা করা, নেটওয়ার্কের ধরন (Wi-Fi, মোবাইল ডেটা, Ethernet) নির্ধারণ করা, সংযোগের পরিবর্তনগুলি ট্র্যাক করা এবং সংযোগের গুণমানের ভিত্তিতে নেটওয়ার্ক অনুরোধগুলি পরিচালনা করার অনুমতি দেয়। Android Developers, 2025 অনুসারে, ConnectivityManager হল নেটওয়ার্ক মনিটরিংয়ের জন্য প্রধান API এবং এটি API Level 1 থেকে Android Framework-এর অংশ।

মূল পয়েন্ট

  • Connectivity Manager — ডিভাইসের নেটওয়ার্ক সংযোগ মনিটর করার জন্য Android সিস্টেম সার্ভিস।
  • NetworkCallback — কলব্যাক নিবন্ধনের মাধ্যমে নেটওয়ার্ক পরিবর্তনগুলি ট্র্যাক করার প্রাথমিক প্রক্রিয়া।
  • NetworkCapabilities — একটি ক্লাস যা বর্তমান নেটওয়ার্কের সক্ষমতা (Wi-Fi, মোবাইল ডেটা, VPN, Ethernet) সম্পর্কে বিস্তারিত তথ্য প্রদান করে।
  • NetworkRequest — নির্দিষ্ট বৈশিষ্ট্য সহ নির্দিষ্ট নেটওয়ার্ক প্রকারে সাবস্ক্রাইব করার জন্য ফিল্টার।
  • getActiveNetworkInfo() — একটি অবচিত পদ্ধতি (API 29 থেকে অবচিত), NetworkCallback এবং registerDefaultNetworkCallback দ্বারা প্রতিস্থাপিত।

Connectivity Manager কী?

ConnectivityManager হল Android অপারেটিং সিস্টেমের একটি সিস্টেম সার্ভিস, যা Context.getSystemService(Context.CONNECTIVITY_SERVICE)-এর মাধ্যমে অ্যাক্সেসযোগ্য। এটি ডিভাইসের নেটওয়ার্ক সংযোগ সম্পর্কে তথ্য পাওয়া, নেটওয়ার্ক পরিবর্তনগুলি মনিটর করা এবং অ্যাপ্লিকেশনের নেটওয়ার্ক অনুরোধগুলি পরিচালনা করার জন্য API প্রদান করে। Connectivity Manager প্ল্যাটফর্মের প্রথম সংস্করণ (API Level 1) থেকে Android Framework-এর অংশ এবং দশক ধরে উল্লেখযোগ্য পরিবর্তনের মধ্য দিয়ে গেছে: সরল getActiveNetworkInfo() থেকে NetworkCallback এবং NetworkRequest-এর সাথে আধুনিক রিঅ্যাকটিভ মডেল পর্যন্ত।

Connectivity Manager-এর প্রধান সক্ষমতার মধ্যে রয়েছে: সক্রিয় নেটওয়ার্ক সংযোগের উপস্থিতি পরীক্ষা করা, নেটওয়ার্কের ধরন (Wi-Fi, মোবাইল ডেটা, Ethernet, Bluetooth, VPN) নির্ধারণ করা, রিয়েল-টাইমে নেটওয়ার্ক অবস্থার পরিবর্তনগুলি মনিটর করা, ব্যান্ডউইথ এবং লেটেন্সি সম্পর্কে তথ্য পাওয়া এবং অ্যাপ্লিকেশনের নেটওয়ার্ক অনুরোধগুলি পরিচালনা করা। ConnectivityManager Offline-First আর্কিটেকচার, অভিযোজিত কন্টেন্ট লোডিং এবং সংযোগের গুণমানের ভিত্তিতে অ্যাপ্লিকেশন অপ্টিমাইজেশন বাস্তবায়নের জন্য WorkManager এবং Repository-এর সাথে ব্যবহার করা হয়।

Android 10 (API 29) থেকে শুরু করে, Google ConnectivityManager-এর সাথে কাজ করার পদ্ধতি পরিবর্তন করেছে। getActiveNetworkInfo() পদ্ধতিটি অবচিত ঘোষণা করা হয়েছে, এবং এর পরিবর্তে NetworkRequest-এর সাথে registerDefaultNetworkCallback() বা registerNetworkCallback() ব্যবহার করার পরামর্শ দেওয়া হয়। নতুন API আরও বিস্তারিত নেটওয়ার্ক তথ্য প্রদান করে, যার মধ্যে ক্যাপটিভ পোর্টাল (প্রমাণীকরণ সহ Wi-Fi) সনাক্ত করার এবং সংযোগের গুণমান মূল্যায়ন করার ক্ষমতা অন্তর্ভুক্ত। ConnectivityManager Jetpack পরিবারের সাথেও একীভূত: ConnectivityManager লাইব্রেরি 2024 সালে Compose অ্যাপ্লিকেশনগুলিতে নেটওয়ার্ক মনিটরিং সহজ করার জন্য Jetpack-এর অংশ হিসাবে প্রকাশিত হয়েছিল।

অ্যাপ্লিকেশন আর্কিটেকচারে Connectivity Manager-এর ভূমিকা

আধুনিক Android আর্কিটেকচারে, Connectivity Manager নেটওয়ার্ক অনুরোধ সম্পর্কে সিদ্ধান্ত নেওয়ার জন্য রিপোজিটরি বা UseCase স্তরে ব্যবহার করা হয়। রিপোজিটরি লেয়ার API কল করার আগে নেটওয়ার্ক অবস্থা পরীক্ষা করে: যদি নেটওয়ার্ক অনুপলব্ধ হয়, তাহলে স্থানীয় স্টোরেজ (Room) থেকে ডেটা ফেরত দেওয়া হয়। যদি নেটওয়ার্ক উপলব্ধ হয়, তাহলে সার্ভারে অনুরোধ করা হয় এবং ফলাফল Room-এ সংরক্ষণ করা হয়। ViewModel Room থেকে Flow-এ সাবস্ক্রাইব করে এবং নেটওয়ার্ক মিথস্ক্রিয়ার বিবরণ সম্পর্কে জানে না — এটি প্রতিটি স্তরকে স্বাধীনভাবে পরীক্ষা করার অনুমতি দেয়।

Connectivity Manager কীভাবে কাজ করে

Connectivity Manager connectivity সিস্টেম সার্ভিস থেকে নেটওয়ার্ক অবস্থার তথ্য পায়, যা Linux কার্নেলের নেটওয়ার্ক ইন্টারফেসের সাথে ইন্টারঅ্যাক্ট করে। যখন ডিভাইস Wi-Fi-এর সাথে সংযুক্ত হয় বা মোবাইল ডেটা চালু করে, তখন কার্নেল সিস্টেম সার্ভিসকে জানায়, যা তার অভ্যন্তরীণ অবস্থা আপডেট করে এবং সমস্ত নিবন্ধিত কলব্যাককে জানায়। ConnectivityManager-এর আর্কিটেকচার Observer প্যাটার্নের উপর নির্মিত: অ্যাপ্লিকেশন একটি NetworkCallback নিবন্ধন করে এবং নেটওয়ার্কের যেকোনো পরিবর্তন — সংযোগ স্থাপন, সংযোগ হারানো, নেটওয়ার্কের ধরন পরিবর্তন বা গুণমানের অবনতি — সম্পর্কে বিজ্ঞপ্তি পায়।

আধুনিক ConnectivityManager API নেটওয়ার্ক ইভেন্ট ফিল্টার করার জন্য NetworkRequest ব্যবহার করে। NetworkRequest নেটওয়ার্কের জন্য প্রয়োজনীয়তা নির্দিষ্ট করার অনুমতি দেয়: ট্রান্সপোর্ট (Transport.WIFI, Transport.CELLULAR, Transport.ETHERNET), ইন্টারনেট ক্ষমতা (NetworkCapabilities.NET_CAPABILITY_INTERNET) এবং অন্যান্য মানদণ্ড। যদি কোনো অ্যাপ্লিকেশনের বড় ফাইল ডাউনলোড করার জন্য শুধুমাত্র Wi-Fi প্রয়োজন হয়, তবে এটি Transport.WIFI-সহ NetworkRequest তৈরি করে এবং একটি কলব্যাক নিবন্ধন করে। সিস্টেম শুধুমাত্র তখনই অ্যাপ্লিকেশনকে জানাবে যখন Wi-Fi সংযোগ পরিবর্তিত হয়, মোবাইল নেটওয়ার্ক ইভেন্ট উপেক্ষা করে।

Android 12+-এ Connectivity Manager-এর একটি গুরুত্বপূর্ণ বৈশিষ্ট্য হল ক্ষমতা-ভিত্তিক নেটওয়ার্কিং। অ্যাপ্লিকেশন শুধু “ইন্টারনেট আছে কি” পরীক্ষা করে না, বরং মূল্যায়ন করতে পারে কী ধরনের ট্রাফিক উপলব্ধ। উদাহরণস্বরূপ, NET_CAPABILITY_NOT_METERED একটি সীমাহীন সংযোগ (Wi-Fi) নির্দেশ করে, NET_CAPABILITY_NOT_ROAMING নির্দেশ করে যে ডিভাইস রোমিংয়ে নেই। এটি সিদ্ধান্ত নেওয়ার অনুমতি দেয়: শুধুমাত্র Wi-Fi-তে ভিডিও ডাউনলোড করুন, রোমিংয়ে সিঙ্ক্রোনাইজেশন স্থগিত করুন, বা শুধুমাত্র জরুরি অনুরোধের জন্য মোবাইল ডেটা ব্যবহার করুন।

API Levelপ্রস্তাবিত পদ্ধতিঅবস্থা
1-22getActiveNetworkInfo()অবচিত
21+NetworkCallback + registerNetworkCallback()প্রস্তাবিত
24+registerDefaultNetworkCallback()প্রস্তাবিত
28+getActiveNetwork() + NetworkCapabilitiesবিকল্প
31+registerBestMatchingNetworkCallback()নতুন API

Connectivity Manager-এর জন্য অনুমতি

Android অ্যাপ্লিকেশনে Connectivity Manager ব্যবহার করার জন্য অনুমতি প্রয়োজন। ACCESS_NETWORK_STATE নেটওয়ার্ক তথ্য পড়ার জন্য বাধ্যতামূলক অনুমতি, যা AndroidManifest.xml-এ ঘোষণা করা হয়। এই অনুমতি ছাড়া, ConnectivityManager getActiveNetwork()-এর জন্য null ফেরত দেবে এবং কলব্যাক আহ্বান করবে না। নেটওয়ার্ক অপারেশন সম্পাদনের জন্য INTERNET অনুমতিও প্রয়োজন। Android 10 (API 29) থেকে শুরু করে, অ্যাপ্লিকেশন অতিরিক্ত রানটাইম অনুমতি ছাড়াই নেটওয়ার্ক অবস্থা পরীক্ষা করতে পারে — ACCESS_NETWORK_STATE একটি সাধারণ অনুমতি এবং ইনস্টলেশনের সময় স্বয়ংক্রিয়ভাবে প্রদান করা হয়।

Connectivity Manager-এর প্রধান পদ্ধতি

আধুনিক Connectivity Manager নেটওয়ার্কের সাথে কাজ করার জন্য বেশ কয়েকটি মূল পদ্ধতি প্রদান করে। getActiveNetwork() (API 23+) বর্তমান সক্রিয় নেটওয়ার্কের Network অবজেক্ট ফেরত দেয় বা ডিভাইস সংযুক্ত না থাকলে null ফেরত দেয়। এই পদ্ধতির কলব্যাকের প্রয়োজন নেই এবং এটি এককালীন পরীক্ষার জন্য উপযুক্ত। Network অবজেক্টটি বিস্তারিত তথ্য — ট্রান্সপোর্টের ধরন, মিটারড অবস্থা, রোমিং, ইন্টারনেট ক্ষমতা এবং অন্যান্য বৈশিষ্ট্য — পাওয়ার জন্য NetworkCapabilities-এ পাস করা যেতে পারে।

registerDefaultNetworkCallback() (API 24+) নেটওয়ার্ক মনিটর করার পছন্দের উপায়। অ্যাপ্লিকেশন একটি কলব্যাক নিবন্ধন করে যা ডিফল্ট নেটওয়ার্কে (যে নেটওয়ার্কের মাধ্যমে অ্যাপ্লিকেশন ট্রাফিক পাঠায়) যেকোনো পরিবর্তনে আহ্বান করা হয়। কলব্যাক একটি Network অবজেক্ট পায় যা সকেট এবং HTTP ক্লায়েন্ট বাইন্ড করার জন্য ব্যবহার করা যেতে পারে। এই পদ্ধতি অবচিত getActiveNetworkInfo()-কে প্রতিস্থাপন করে এবং পোলিং ছাড়াই রিঅ্যাকটিভ নেটওয়ার্ক মনিটরিং প্রদান করে।

registerNetworkCallback() (API 21+) NetworkRequest-এর মাধ্যমে একটি নির্দিষ্ট নেটওয়ার্ক প্রকারের পরিবর্তনগুলিতে সাবস্ক্রাইব করার অনুমতি দেয়। উদাহরণস্বরূপ, একটি অ্যাপ্লিকেশন new NetworkRequest.Builder().addTransportType(NetworkCapabilities.TRANSPORT_WIFI).build() ব্যবহার করে শুধুমাত্র Wi-Fi নেটওয়ার্ক ট্র্যাক করতে পারে। সিস্টেম মোবাইল নেটওয়ার্ক ইভেন্টকে প্রভাবিত না করে Wi-Fi সংযোগ/বিচ্ছিন্নতা সম্পর্কে অ্যাপ্লিকেশনকে জানাবে। NetworkCapabilities.getLinkDownstreamBandwidthKbps() kbit/s-এ ডাউনস্ট্রিম ব্যান্ডউইথের একটি অনুমান ফেরত দেয়, যা সংযোগের গতির সাথে কন্টেন্টের গুণমান মানিয়ে নেওয়ার অনুমতি দেয়।

পদ্ধতিসর্বনিম্ন APIউদ্দেশ্য
getActiveNetwork()23বর্তমান সক্রিয় নেটওয়ার্ক পাওয়া
getNetworkCapabilities()21নেটওয়ার্ক সক্ষমতা পাওয়া (প্রকার, মিটারড, রোমিং)
registerDefaultNetworkCallback()24ডিফল্ট নেটওয়ার্ক মনিটর করা
registerNetworkCallback()21NetworkRequest ফিল্টার দ্বারা নেটওয়ার্ক মনিটর করা
unregisterNetworkCallback()21কলব্যাক নিবন্ধন বাতিল করা
getActiveNetworkInfo()1অবচিত, ব্যবহার করবেন না

Jetpack Compose-এ ConnectivityManager

Jetpack Connectivity লাইব্রেরি (androidx.core:core-ktx) Compose-এ ConnectivityManager-এর সাথে কাজ করার জন্য সুবিধাজনক এক্সটেনশন প্রদান করে। ConnectivityManager.observeAsState() ফাংশন একটি State ফেরত দেয় যা নেটওয়ার্ক পরিবর্তিত হলে আপডেট হয়। @Composable NetworkStatus() কম্পোনেন্ট সংযোগের অবস্থা প্রদর্শন করে এবং পরিবর্তনে স্বয়ংক্রিয়ভাবে পুনরায় আঁকে। এটি ডেভেলপারকে ম্যানুয়ালি কলব্যাক এবং Activity/Fragment জীবনচক্র পরিচালনা থেকে মুক্ত করে।

NetworkCallback এবং নেটওয়ার্ক পরিবর্তনগুলি পরিচালনা

ConnectivityManager.NetworkCallback একটি বিমূর্ত ক্লাস যার পদ্ধতিগুলি নেটওয়ার্ক অবস্থা পরিবর্তিত হলে সিস্টেম দ্বারা আহ্বান করা হয়। onAvailable(Network) — আহ্বান করা হয় যখন একটি নেটওয়ার্ক উপলব্ধ হয়। অ্যাপ্লিকেশন একটি Network অবজেক্ট পায় যা Network.bindSocket()-এর মাধ্যমে সকেট বাইন্ড করার জন্য ব্যবহার করা যেতে পারে। onLost(Network) — আহ্বান করা হয় যখন একটি নেটওয়ার্ক অনুপলব্ধ হয়। অ্যাপ্লিকেশনটির স্থানীয় ডেটাতে স্যুইচ করা বা সংযোগ নেই এমন বার্তা দেখানো উচিত। onCapabilitiesChanged(Network, NetworkCapabilities) — আহ্বান করা হয় যখন নেটওয়ার্ক বৈশিষ্ট্য পরিবর্তিত হয় (উদাহরণস্বরূপ, Wi-Fi থেকে মোবাইল ডেটাতে স্যুইচ করার সময়)।

নেটওয়ার্ক পরিবর্তনগুলির সঠিক পরিচালনার জন্য কম্পোনেন্টের জীবনচক্র বিবেচনা করা প্রয়োজন। কলব্যাক নিবন্ধন করতে হবে onStart()/onResume()-এ এবং onStop()/onPause()-এ বাতিল করতে হবে। যদি কলব্যাক বাতিল না করা হয়, তবে এটি Activity ধ্বংস হওয়ার পরেও চলতে পারে, যা মেমরি লিক এবং সম্ভাব্য NullPointerException সৃষ্টি করে যখন কলব্যাক ধ্বংস হওয়া কম্পোনেন্টের UI আপডেট করার চেষ্টা করে। স্বয়ংক্রিয় নিবন্ধন পরিচালনার জন্য lifecycleScope বা repeatOnLifecycle ব্যবহার করুন। Jetpack Compose-এ, কলব্যাক নিবন্ধন এবং বাতিলের জন্য DisposableEffect ব্যবহার করুন।

ক্যাপটিভ পোর্টাল পরিচালনা Android 10 থেকে শুরু হওয়া ConnectivityManager-এর একটি গুরুত্বপূর্ণ বৈশিষ্ট্য। CAPTIVE_PORTAL এমন একটি পরিস্থিতি যেখানে Wi-Fi নেটওয়ার্ক উপলব্ধ কিন্তু একটি ওয়েব পৃষ্ঠার মাধ্যমে প্রমাণীকরণ প্রয়োজন (বিমানবন্দর, হোটেল, ক্যাফে)। NetworkCapabilities.NET_CAPABILITY_VALIDATED নির্দেশ করে যে নেটওয়ার্কের সম্পূর্ণ ইন্টারনেট অ্যাক্সেস আছে। যদি NET_CAPABILITY_VALIDATED অনুপস্থিত থাকে, অ্যাপ্লিকেশন ক্যাপটিভ পোর্টাল প্রমাণীকরণের জন্য ব্রাউজার খুলতে পারে। Android 11 (API 30)-এ যোগ করা isCaptivePortal() পদ্ধতি ক্যাপটিভ পোর্টাল সনাক্ত করতে ব্যবহৃত হয়।

নির্দিষ্ট উদ্দেশ্যে নেটওয়ার্ক (NetworkRequest)

ConnectivityManager requestNetwork() এবং bindProcessToNetwork()-এর মাধ্যমে নির্দিষ্ট উদ্দেশ্যে নেটওয়ার্ক অনুরোধ করার অনুমতি দেয়। উদাহরণস্বরূপ, একটি অ্যাপ্লিকেশন যা বড় ফাইল ডাউনলোড করে মোবাইল ডেটা সক্রিয় থাকলেও Wi-Fi নেটওয়ার্ক অনুরোধ করতে পারে। এটি করার জন্য, addTransportType(TRANSPORT_WIFI)-সহ NetworkRequest তৈরি করা হয়, এবং যখন Wi-Fi উপলব্ধ হয়, সিস্টেম onAvailable() কল করে। অ্যাপ্লিকেশন network.bindSocket() বা কনফিগার করা Network অবজেক্ট-সহ OkHttp-এর মাধ্যমে এই নেটওয়ার্কের সাথে সকেট বাইন্ড করে। এটি নেটওয়ার্ক ইন্টারফেসের ব্যবহারের উপর নমনীয় নিয়ন্ত্রণ প্রদান করে।

Kotlin-এ বাস্তবায়নের উদাহরণ

আসুন Clean Architecture-এ আধুনিক API (NetworkCallback)-সহ ConnectivityManager ব্যবহারের একটি সম্পূর্ণ উদাহরণ দেখি। NetworkMonitor হল ConnectivityManager-এর চারপাশে একটি র্যাপার ক্লাস যা StateFlow-এর মাধ্যমে রিঅ্যাকটিভ নেটওয়ার্ক অবস্থা প্রদান করে। ViewModel এই Flow-এ সাবস্ক্রাইব করে এবং অবস্থা UI-তে পাঠায়। Repository নেটওয়ার্ক অনুরোধ সম্পর্কে সিদ্ধান্ত নিতে NetworkMonitor ব্যবহার করে। এই পদ্ধতি পরীক্ষাযোগ্যতা এবং প্ল্যাটফর্ম নির্ভরতা বিচ্ছিন্নতা নিশ্চিত করে।

নীচের উদাহরণটি দেখায় কিভাবে registerDefaultNetworkCallback-সহ ConnectivityManager সঠিকভাবে ব্যবহার করতে হয়। NetworkMonitor ক্লাস সিস্টেম সার্ভিসের সাথে কাজ এনক্যাপসুলেট করে এবং একটি পরিষ্কার Kotlin Flow প্রদান করে। এটি শুরুতে কলব্যাক নিবন্ধন করে এবং জীবনচক্রের শেষে এটি বাতিল করে। coroutines এবং callbackFlow — ConnectivityManager-এর কলব্যাক-স্টাইল এবং Kotlin-এর রিঅ্যাকটিভ Flow-স্টাইলের মধ্যে সেতু — এর মাধ্যমে অ্যাসিঙ্ক্রোনাস অপারেশন নিশ্চিত করা হয়।

kotlin
class NetworkMonitor(
    private val connectivityManager: ConnectivityManager
) {
    val isOnline: StateFlow<Boolean> = callbackFlow {
        val callback = object : ConnectivityManager.NetworkCallback() {
            override fun onAvailable(network: Network) {
                trySend(true)
            }
            override fun onLost(network: Network) {
                trySend(false)
            }
            override fun onCapabilitiesChanged(
                network: Network,
                caps: NetworkCapabilities
            ) {
                val connected = caps.hasCapability(
                    NetworkCapabilities.NET_CAPABILITY_INTERNET
                )
                trySend(connected)
            }
        }
        connectivityManager.registerDefaultNetworkCallback(callback)
        awaitClose {
            connectivityManager.unregisterNetworkCallback(callback)
        }
    }.stateIn(
        CoroutineScope(Dispatchers.Default),
        SharingStarted.WhileSubscribed(5000),
        initialValue = checkInitialState()
    )

    private fun checkInitialState(): Boolean {
        val network = connectivityManager.getActiveNetwork() ?: return false
        val caps = connectivityManager.getNetworkCapabilities(network) ?: return false
        return caps.hasCapability(
            NetworkCapabilities.NET_CAPABILITY_INTERNET
        )
    }
}

ViewModel এবং Repository-তে NetworkMonitor ব্যবহার

ViewModel NetworkMonitor.isOnline-এ stateIn()-এর মাধ্যমে সাবস্ক্রাইব করে এবং অবস্থা Compose-এ পাঠায়। Repository API কল করার আগে বর্তমান isOnline.value পরীক্ষা করে: যদি false — Room থেকে Flow ফেরত দেয়। যদি true — API কল করে, ফলাফল Room-এ সংরক্ষণ করে এবং Room থেকে Flow ফেরত দেয়। WorkManager পটভূমির কাজ সীমাবদ্ধ করতে NetworkType.CONNECTED ব্যবহার করে। NetworkMonitor-এর পরীক্ষা mock ConnectivityManager অবজেক্ট এবং fake NetworkCallback-এর সাথে করা হয়, যা ইউনিট পরীক্ষায় যেকোনো নেটওয়ার্ক পরিস্থিতি অনুকরণ করার অনুমতি দেয়।

সেরা অনুশীলন এবং সাধারণ ভুল

ConnectivityManager-এর সাথে কাজ করার প্রথম নিয়ম হল অবচিত API ব্যবহার না করা। getActiveNetworkInfo() API 29 থেকে অবচিত এবং নতুন Android সংস্করণগুলিতে ভুল ডেটা ফেরত দিতে পারে। এর পরিবর্তে, একবার পরীক্ষার জন্য getActiveNetwork() + getNetworkCapabilities() এবং ক্রমাগত মনিটরিংয়ের জন্য registerDefaultNetworkCallback() ব্যবহার করুন। পুরানো পদ্ধতিটি ক্যাপটিভ পোর্টাল এবং সম্পূর্ণ ইন্টারনেটযুক্ত নেটওয়ার্কের মধ্যে পার্থক্য করে না, যা মিথ্যা পজিটিভের দিকে নিয়ে যায়।

দ্বিতীয় নিয়ম হল সর্বদা কলব্যাক নিবন্ধন বাতিল করুন। যদি একটি Activity onStart()-এ NetworkCallback নিবন্ধন করে কিন্তু onStop()-এ এটি বাতিল না করে, কলব্যাকটি Activity ধ্বংস হওয়ার পরেও চলতে থাকে। এটি মেমরি লিক এবং সম্ভাব্য NullPointerException সৃষ্টি করে যখন কলব্যাক ধ্বংস হওয়া কম্পোনেন্টের UI আপডেট করার চেষ্টা করে। স্বয়ংক্রিয় নিবন্ধন পরিচালনার জন্য lifecycleScope বা repeatOnLifecycle ব্যবহার করুন। Jetpack Compose-এ, কলব্যাক নিবন্ধন এবং বাতিলের জন্য DisposableEffect ব্যবহার করুন।

তৃতীয় সাধারণ ভুল হল গুণমান বিবেচনা না করে শুধুমাত্র নেটওয়ার্ক উপলব্ধতা পরীক্ষা করা। একটি সরল “ইন্টারনেট আছে কি” সিদ্ধান্ত নেওয়ার জন্য যথেষ্ট নয়। অ্যাপ্লিকেশনটির বড় ফাইল ডাউনলোড করার জন্য NET_CAPABILITY_NOT_METERED, পটভূমিতে সিঙ্ক্রোনাইজেশনের জন্য NET_CAPABILITY_NOT_ROAMING এবং ইন্টারনেট অ্যাক্সেস নিশ্চিত করার জন্য NET_CAPABILITY_VALIDATED পরীক্ষা করা উচিত। এই ফ্ল্যাগগুলি উপেক্ষা করলে অ্যাপ্লিকেশন রোমিংয়ে ভিডিও ডাউনলোড করার বা হোটেলের ক্যাপটিভ পোর্টালের মাধ্যমে ডেটা সিঙ্ক্রোনাইজ করার চেষ্টা করে।

চতুর্থ নিয়ম হল একটি নির্দিষ্ট সার্ভারের উপলব্ধতা পরীক্ষা করার জন্য ConnectivityManager ব্যবহার না করা। ConnectivityManager ডিভাইসে নেটওয়ার্ক অবস্থা রিপোর্ট করে, কিন্তু গ্যারান্টি দেয় না যে সার্ভার অ্যাক্সেসযোগ্য। API উপলব্ধতা পরীক্ষা করার জন্য, ছোট টাইমআউট-সহ HTTP অনুরোধ বা Health Check ব্যবহার করুন। ConnectivityManager + HTTP ping একটি নির্ভরযোগ্য সংমিশ্রণ: প্রথমে নেটওয়ার্ক উপলব্ধতা পরীক্ষা করুন, তারপর প্রকৃত অ্যাক্সেসযোগ্যতা নিশ্চিত করতে সার্ভারে হালকা অনুরোধ করুন।

ConnectivityManager পরীক্ষা

ইউনিট পরীক্ষার জন্য, Robolectric ব্যবহার করুন ShadowConnectivityManager-সহ, যা নেটওয়ার্ক অবস্থা অনুকরণ করার অনুমতি দেয়। ইন্টিগ্রেশন পরীক্ষার জন্য — এয়ারপ্লেন মোড টগল-সহ Android Test Orchestrator। পরীক্ষাগুলিতে, পরিস্থিতিগুলি পরীক্ষা করুন: অনলাইন থেকে অফলাইনে রূপান্তর, মোবাইল ডেটা সক্রিয় থাকাকালীন Wi-Fi দেখা দেওয়া, অনুরোধের সময় নেটওয়ার্ক হারানো, ক্যাপটিভ পোর্টাল, রোমিং। ইউনিট পরীক্ষায় মকিংয়ের জন্য, একটি র্যাপার ইন্টারফেস (যেমন NetworkMonitorInterface) ব্যবহার করুন যা প্ল্যাটফর্ম নির্ভরতা ছাড়াই mock অবজেক্ট দিয়ে প্রতিস্থাপন করা যেতে পারে।

সচরাচর জিজ্ঞাসিত প্রশ্ন

আমি কীভাবে পরীক্ষা করব যে ডিভাইসটি ইন্টারনেটের সাথে সংযুক্ত কিনা?

আধুনিক উপায় হল onCapabilitiesChanged()-এ NET_CAPABILITY_INTERNET পরীক্ষা-সহ registerDefaultNetworkCallback() ব্যবহার করা। একবার পরীক্ষার জন্য: connectivityManager.getActiveNetwork()?.let { caps -> caps.hasCapability(NET_CAPABILITY_INTERNET) } ?: false. অবচিত getActiveNetworkInfo() পদ্ধতি API 29+ থেকে সুপারিশ করা হয় না।

ConnectivityManager-এর জন্য কী অনুমতি প্রয়োজন?

নেটওয়ার্ক তথ্য পড়ার জন্য android.permission.ACCESS_NETWORK_STATE অনুমতি প্রয়োজন। এটি একটি সাধারণ অনুমতি — এটি অ্যাপ্লিকেশন ইনস্টল করার সময় স্বয়ংক্রিয়ভাবে প্রদান করা হয় এবং রানটাইম অনুরোধের প্রয়োজন নেই। নেটওয়ার্ক অপারেশন (HTTP অনুরোধ) সম্পাদনের জন্য INTERNET অনুমতিও প্রয়োজন।

registerDefaultNetworkCallback এবং registerNetworkCallback-এর মধ্যে পার্থক্য কী?

registerDefaultNetworkCallback() ডিফল্ট নেটওয়ার্ক নিরীক্ষণ করে — যে নেটওয়ার্কের মাধ্যমে অ্যাপ্লিকেশন তার প্রধান ট্রাফিক পাঠায়। registerNetworkCallback(NetworkRequest) প্রদত্ত ফিল্টার (যেমন শুধুমাত্র Wi-Fi) এর সাথে মেলে এমন নেটওয়ার্কগুলি নিরীক্ষণ করে। ডিফল্ট কলব্যাক সহজ এবং 90% পরিস্থিতি কভার করে, যখন কাস্টম অনুরোধ নির্দিষ্ট নেটওয়ার্ক প্রকারের প্রয়োজনীয়তার জন্য।

আমি কীভাবে নেটওয়ার্কের ধরন নির্ধারণ করব: Wi-Fi না মোবাইল ডেটা?

NetworkCapabilities ব্যবহার করুন: Wi-Fi-এর জন্য caps.hasTransport(NetworkCapabilities.TRANSPORT_WIFI), মোবাইল ডেটার জন্য hasTransport(TRANSPORT_CELLULAR)। ConnectivityManager.getActiveNetworkInfo().getType() ব্যবহার করবেন না — এই পদ্ধতি অবচিত। NetworkCapabilities connectivityManager.getNetworkCapabilities(network)-এর মাধ্যমে উপলব্ধ।

কেন getActiveNetworkInfo() অবচিত?

getActiveNetworkInfo() ভুলের কারণে অবচিত: এটি ক্যাপটিভ পোর্টাল এবং সম্পূর্ণ ইন্টারনেটযুক্ত নেটওয়ার্কের মধ্যে পার্থক্য করে না, এবং ব্যান্ডউইথ বা রোমিং তথ্য প্রদান করে না। Android 10 থেকে শুরু করে, এই পদ্ধতি মাল্টি-নেটওয়ার্ক সংযোগের জন্য null বা ভুল ডেটা ফেরত দিতে পারে। প্রতিস্থাপন হল getActiveNetwork() + NetworkCapabilities।

সারসংক্ষেপ

  • ConnectivityManager — নেটওয়ার্ক সংযোগ পর্যবেক্ষণের জন্য Android সিস্টেম সার্ভিস, getSystemService(CONNECTIVITY_SERVICE)-এর মাধ্যমে অ্যাক্সেসযোগ্য।
  • আধুনিক API — registerDefaultNetworkCallback() + NetworkCapabilities, API 29 থেকে অবচিত getActiveNetworkInfo()-কে প্রতিস্থাপন করে।
  • NetworkCapabilities — নেটওয়ার্কের ধরন (Wi-Fi, Cellular), মিটারিং, রোমিং এবং ইন্টারনেট সংযোগ যাচাইয়ের জন্য ক্লাস।
  • NetworkCallback — onAvailable, onLost এবং onCapabilitiesChanged পদ্ধতি-সহ নেটওয়ার্ক পরিবর্তন ট্র্যাক করার রিঅ্যাকটিভ মনিটরিং প্রক্রিয়া।
  • NetworkRequest — সঠিক নিয়ন্ত্রণের জন্য registerNetworkCallback()-এর সাথে ব্যবহৃত নির্দিষ্ট ধরনের নেটওয়ার্কে সাবস্ক্রাইব করার ফিল্টার।
  • ACCESS_NETWORK_STATE অনুমতি — ConnectivityManager-এর সাথে কাজ করার জন্য বাধ্যতামূলক, অ্যাপ্লিকেশন ইনস্টল করার সময় স্বয়ংক্রিয়ভাবে প্রদান করা হয়।
  • সেরা অনুশীলন — onStop()-এ কলব্যাক বাতিল করুন, NET_CAPABILITY_NOT_METERED এবং NET_CAPABILITY_VALIDATED পরীক্ষা করুন, গুণমান পরীক্ষা না করে শুধুমাত্র নেটওয়ার্কের উপস্থিতির উপর নির্ভর করবেন না।

আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব

IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।

প্রকল্প নিয়ে আলোচনা করুন

আরও পড়ুন