NetworkCallback হল Android SDK-এর একটি অ্যাবস্ট্র্যাক্ট ক্লাস যা ConnectivityManager-এর মাধ্যমে নেটওয়ার্ক অবস্থার পরিবর্তন পর্যবেক্ষণের জন্য। Android Developers Documentation (2025) অনুসারে, NetworkCallback ব্যবহার আপনার অ্যাপকে সংযোগ, বিচ্ছিন্নকরণ বা সংযোগ বৈশিষ্ট্যের পরিবর্তনে সময়মতো সাড়া দিতে সক্ষম করে। ConnectivityManager.NetworkCallback সিস্টেম সার্ভিসে ক্রমাগত পোলিং না করেই নেটওয়ার্কের ধরন, ক্যাপটিভ পোর্টাল এবং ইন্টারনেট হারানোর বিষয়ে বিস্তারিত তথ্য প্রদান করে।
মূল বিষয়
NetworkCallback হল android.net প্যাকেজের একটি অ্যাবস্ট্র্যাক্ট ক্লাস, যা Android SDK-এর অংশ। এটি ConnectivityManager সিস্টেম সার্ভিসের মাধ্যমে নেটওয়ার্ক সংযোগ অবস্থার পরিবর্তন সম্পর্কে বিজ্ঞপ্তি পাওয়ার জন্য ডিজাইন করা হয়েছে।
NetworkCallback-এর আগে, ডেভেলপাররা নেটওয়ার্ক পরিবর্তন ট্র্যাক করতে BroadcastReceiver ব্যবহার করতেন। এই পদ্ধতিতে ম্যানিফেস্টে ধ্রুবক রেজিস্ট্রেশন প্রয়োজন ছিল, বিলম্বে কাজ করত এবং সংযোগের বৈশিষ্ট্য সম্পর্কে বিস্তারিত তথ্য দিত না। Android 5.0 (API 21) NetworkCallback-কে আরও নমনীয় এবং কার্যকর বিকল্প হিসেবে চালু করেছে।
কলব্যাক অ্যাসিঙ্ক্রোনাসভাবে কাজ করে: অ্যাপ ConnectivityManager-এর মাধ্যমে ইভেন্টগুলিতে সাবস্ক্রাইব করে এবং নেটওয়ার্ক অবস্থা পরিবর্তিত হলে সিস্টেম কলব্যাক পদ্ধতিগুলি কল করে। এটি নেটওয়ার্ক অবস্থার পর্যায়ক্রমিক পোলিং-এর প্রয়োজনীয়তা দূর করে, ব্যাটারি এবং CPU সম্পদ সাশ্রয় করে।
ConnectivityManager ডিভাইসের সমস্ত নেটওয়ার্ক ইন্টারফেস — Wi-Fi, মোবাইল ডেটা, Ethernet, VPN পরিচালনা করে। যখন এই ইন্টারফেসগুলির কোনওটি পরিবর্তিত হয়, সিস্টেম একটি Network অবজেক্ট তৈরি করে এবং এটি রেজিস্টার করা কলব্যাকের সংশ্লিষ্ট পদ্ধতিতে পাঠায়। প্রতিটি Network-এর একটি অনন্য শনাক্তকারী থাকে যা পুনঃসংযোগের সময় পরিবর্তিত হয়।
কলব্যাক কোনও নির্দিষ্ট নেটওয়ার্ক ধরনের সাথে আবদ্ধ নয় — এটি একসাথে সমস্ত উপলব্ধ ইন্টারফেস ট্র্যাক করতে পারে। সংযোগের ধরন ফিল্টার করতে NetworkRequest ক্লাস ব্যবহার করা হয়, যা প্রয়োজনীয় পরিবহন প্রোটোকল (Wi-Fi, সেলুলার ডেটা, Ethernet) এবং নেটওয়ার্ক ক্ষমতা নির্দিষ্ট করে।
NetworkCallback রেজিস্ট্রেশন ConnectivityManager.registerNetworkCallback পদ্ধতির মাধ্যমে করা হয়। প্রথম প্যারামিটার হল একটি NetworkRequest.Builder যা নেটওয়ার্ক প্রয়োজনীয়তা বর্ণনা করে, দ্বিতীয়টি হল একটি কলব্যাক ইনস্ট্যান্স। ম্যানিফেস্টে ACCESS_NETWORK_STATE অনুমতি প্রয়োজন।
class NetworkMonitor(private val context: Context) {
private val connectivityManager =
context.getSystemService(Context.CONNECTIVITY_SERVICE)
as ConnectivityManager
private val callback =
object : ConnectivityManager.NetworkCallback() {
override fun onAvailable(network: Network) {
Log.d("Network", "Available: ${network}")
}
override fun onLost(network: Network) {
Log.d("Network", "Lost: ${network}")
}
}
fun register() {
connectivityManager.registerNetworkCallback(
NetworkRequest.Builder().build(), callback
)
}
fun unregister() {
connectivityManager.unregisterNetworkCallback(callback)
}
}
সুপারিশ করা হয় যে অ্যাপ ফোরগ্রাউন্ডে থাকাকালীন NetworkCallback রেজিস্টার করুন এবং ব্যাকগ্রাউন্ডে যাওয়ার সময় বাতিল করুন। Activity-তে, কলব্যাক লাইফসাইকেল পরিচালনা করতে onStart এবং onStop ব্যবহার করুন। Fragment-এ, onResume এবং onPause ব্যবহার করুন।
রেজিস্ট্রেশন পরিচালনা সহজ করতে, আপনি Lifecycle-সচেতন কম্পোনেন্ট ব্যবহার করতে পারেন। AndroidX Lifecycle লাইব্রেরি আপনাকে একটি কাস্টম LifecycleObserver তৈরি করতে দেয় যা লাইফসাইকেল অবস্থা পরিবর্তিত হলে স্বয়ংক্রিয়ভাবে কলব্যাক রেজিস্টার এবং বাতিল করে।
ব্যাকগ্রাউন্ড কাজের জন্য, রেজিস্ট্রেশন Service বা WorkManager-এ করা হয়। লক্ষ্য করুন যে Android 8+-এ, ব্যাকগ্রাউন্ড সার্ভিসগুলিতে লঞ্চ সীমাবদ্ধতা রয়েছে। NetworkType সহ WorkManager একটি নির্দিষ্ট নেটওয়ার্ক অবস্থার অধীনে কাজ সম্পাদনের আরও নির্ভরযোগ্য উপায়, কারণ এটি সামঞ্জস্য API-এর সাথে সংহত এবং Doze মোডকে সম্মান করে।
NetworkCallback পদ্ধতিগুলির একটি সেট প্রদান করে যা নেটওয়ার্ক অবস্থা পরিবর্তিত হলে কল করা হয়। সমস্ত পদ্ধতি ওভাররাইড করার প্রয়োজন নেই — শুধুমাত্র আপনার অ্যাপের নির্দিষ্ট কাজের জন্য যেগুলি প্রয়োজন সেগুলি বাস্তবায়ন করুন। onAvailable এবং onLost মৌলিক সংযোগ পর্যবেক্ষণের জন্য ন্যূনতম প্রয়োজনীয়।
| পদ্ধতি | কখন কল করা হয় | প্যারামিটার |
|---|---|---|
| onAvailable | নেটওয়ার্ক ব্যবহারের জন্য উপলব্ধ | Network — নেটওয়ার্ক অবজেক্ট |
| onLost | নেটওয়ার্ক হারিয়ে গেছে বা বিচ্ছিন্ন হয়েছে | Network — নেটওয়ার্ক অবজেক্ট |
| onCapabilitiesChanged | নেটওয়ার্ক ক্ষমতা পরিবর্তিত হয়েছে | Network, NetworkCapabilities |
| onBlockedStatusChanged | ব্লকিং অবস্থা পরিবর্তিত হয়েছে | Network, Boolean |
| onNetworkSuspended | সিস্টেম দ্বারা নেটওয়ার্ক স্থগিত | Network |
| onNetworkResumed | স্থগিতের পর নেটওয়ার্ক পুনরায় শুরু | Network |
এই পদ্ধতিটি নেটওয়ার্ক সম্পর্কে বিস্তারিত তথ্য পাওয়ার জন্য গুরুত্বপূর্ণ। NetworkCapabilities প্যারামিটারে ফ্ল্যাগ থাকে: NET_CAPABILITY_INTERNET — ইন্টারনেট অ্যাক্সেস উপলব্ধ, NET_CAPABILITY_NOT_METERED — সীমাহীন সংযোগ, NET_CAPABILITY_NOT_ROAMING — কোনও রোমিং নেই। সিগন্যাল বিলম্ব এবং ব্যান্ডউইথও জানা যায়।
ক্যাপটিভ পোর্টাল একটি বিশেষ ক্ষেত্রে: একটি পোর্টালের মাধ্যমে পাবলিক Wi-Fi নেটওয়ার্কে সংযোগ করার সময়, onCapabilitiesChanged পদ্ধতি অবিলম্বে INTERNET দেখায় না। নেটওয়ার্ক শুরুতে উপলব্ধ কিন্তু ইন্টারনেট ছাড়া — ব্রাউজারের মাধ্যমে অনুমোদন প্রয়োজন। ডেভেলপারদের অ্যাপ যুক্তিতে এই বিলম্ব বিবেচনা করতে হবে।
যখন সিস্টেম অ্যাপের জন্য নেটওয়ার্ক ট্রাফিক ব্লক করে — উদাহরণস্বরূপ, ডেটা সেভার মোড চালু হলে বা ব্যাকগ্রাউন্ড ডেটা সীমাবদ্ধ হলে — এটি কল করা হয়। onBlockedStatusChanged অ্যাপকে জানায় যে এর নেটওয়ার্ক অনুরোধগুলি সাময়িকভাবে নিষিদ্ধ এবং স্থানীয় প্রক্রিয়াকরণে স্যুইচ করুন।
ইন্টারনেট অ্যাক্সেস পর্যবেক্ষণ এবং ক্যাপটিভ পোর্টাল পরিচালনার জন্য একটি ব্যবহারিক NetworkCallback বাস্তবায়ন দেখা যাক। নীচের উদাহরণটি NET_CAPABILITY_INTERNET যাচাই এবং Google সার্ভারে HTTP অনুরোধের মাধ্যমে সংযোগ বৈধতা দেখায়।
val networkCallback = object : ConnectivityManager.NetworkCallback() {
override fun onCapabilitiesChanged(
network: Network,
caps: NetworkCapabilities
) {
val hasInternet = caps.hasCapability(
NetworkCapabilities.NET_CAPABILITY_INTERNET
)
val isMetered = caps.hasCapability(
NetworkCapabilities.NET_CAPABILITY_NOT_METERED
).not()
when {
hasInternet && isMetered ->
Log.d("Network", "Mobile data connected")
hasInternet ->
Log.d("Network", "Wi-Fi connected")
else ->
Log.d("Network", "No internet access")
}
}
override fun onLost(network: Network) {
Log.d("Network", "Connection lost: ${network}")
// নেটওয়ার্ক অনুরোধ বন্ধ করুন
}
}
অনুমোদন সহ পাবলিক নেটওয়ার্কে (ক্যাফে, বিমানবন্দর) সংযোগ করার সময়, সিস্টেম প্রথমে onAvailable জানায়, কিন্তু onCapabilitiesChanged INTERNET নাও দেখাতে পারে। এই ধরনের ক্ষেত্রে, একটি স্থিতিশীল এন্ডপয়েন্ট যেমন https://www.google.com/generate_204-এ HTTP অনুরোধের মাধ্যমে অতিরিক্ত যাচাই প্রয়োজন।
যদি অনুরোধ কোড 204 ফেরত দেয় — ইন্টারনেট উপলব্ধ। যদি রিডাইরেক্ট (301, 302, 307) — ব্রাউজারের মাধ্যমে অনুমোদন প্রয়োজন। এই ক্ষেত্রে, আপনি পোর্টাল প্রমাণীকরণ সম্পূর্ণ করতে রিডাইরেক্ট URL-এ একটি WebView বা Intent খুলতে পারেন।
fun Context.validateInternet(network: Network) {
CoroutineScope(Dispatchers.IO).launch {
try {
val url = URL("https://www.google.com/generate_204")
val connection =
network.openConnection(url) as HttpURLConnection
connection.instanceFollowRedirects = false
connection.connect()
when (connection.responseCode) {
HttpURLConnection.HTTP_NO_CONTENT ->
Log.d("Network", "Internet is available")
in HttpURLConnection.HTTP_MOVED_PERM
..HttpURLConnection.HTTP_TEMP_REDIRECT ->
Log.d("Network", "Captive portal detected")
}
connection.disconnect()
} catch (e: Exception) {
Log.e("Network", "Validation failed: ${e.message}")
}
}
}
NetworkCallback-এর আগে, নেটওয়ার্ক পর্যবেক্ষণের প্রাথমিক পদ্ধতি ছিল android.net.conn.CONNECTIVITY_CHANGE ফিল্টার সহ BroadcastReceiver। এই পদ্ধতির উল্লেখযোগ্য ত্রুটি ছিল: কয়েক সেকেন্ডের বিলম্ব, ইন্টারফেস ধরনের তথ্যের অভাব এবং ডিভাইসের ক্রমাগত জাগরণের কারণে বর্ধিত শক্তি খরচ।
একটি আধুনিক বিকল্প হল LiveData বা StateFlow NetworkCallback-এর সাথে মিলিত। প্যাটার্নটিতে কলব্যাককে একটি রিঅ্যাকটিভ স্ট্রিমে মোড়ানো জড়িত যা স্বয়ংক্রিয়ভাবে UI-কে অবস্থা পরিবর্তন সম্পর্কে অবহিত করে। উদাহরণস্বরূপ, NetworkStatus টাইপ সহ একটি MutableStateFlow কলব্যাক পদ্ধতির ভিতরে আপডেট হয় এবং একটি ViewCollector পরিবর্তনগুলিতে সাবস্ক্রাইব করে।
| পদ্ধতি | API Level | বিলম্ব | বিস্তারিত স্তর | শক্তি খরচ |
|---|---|---|---|---|
| BroadcastReceiver | 1+ | উচ্চ | নিম্ন | উচ্চ |
| NetworkCallback | 21+ | নিম্ন | উচ্চ | নিম্ন |
| ConnectivityManager.getActiveNetwork | 23+ | তাৎক্ষণিক | মধ্যম | শূন্য |
| NWPathMonitor (iOS) | iOS 12+ | নিম্ন | উচ্চ | নিম্ন |
Android 10 থেকে শুরু করে, ব্যাকগ্রাউন্ড সীমাবদ্ধতা কঠোর হয়েছে এবং অ্যাপ ব্যাকগ্রাউন্ডে থাকাকালীন NetworkCallback কল নাও হতে পারে। গুরুত্বপূর্ণ কাজের জন্য — যেমন নেটওয়ার্ক উপলব্ধ হলে ডেটা লোড করা — NetworkType.CONNECTED বাধা সহ WorkManager ব্যবহার করুন। WorkManager নেটওয়ার্ক শর্ত পূরণ হলে কাজ সম্পাদনের গ্যারান্টি দেয়।
Android 12+-এ, CONNECTIVITY_ACTION-এর জন্য BroadcastReceiver-এর ম্যানিফেস্ট রেজিস্ট্রেশন-এ সীমাবদ্ধতা রয়েছে। ডেভেলপারদের NetworkCallback-এ মাইগ্রেট করতে হবে বা WorkManager ব্যবহার করতে হবে। Google Play নীতি আগস্ট 2022 থেকে এই অ্যাকশনের জন্য ম্যানিফেস্ট রেজিস্ট্রেশন অপসারণ প্রয়োজন।
সচরাচর জিজ্ঞাসিত প্রশ্ন
BroadcastReceiver CONNECTIVITY_CHANGE সহ বিস্তারিত ছাড়া এবং কয়েক সেকেন্ড পর্যন্ত বিলম্ব সহ শুধুমাত্র নেটওয়ার্ক পরিবর্তনের ঘটনা প্রদান করে। NetworkCallback অ্যাসিঙ্ক্রোনাসভাবে কাজ করে, Network অবজেক্ট, ইন্টারফেস ধরন, সংযোগ ক্ষমতা প্রদান করে এবং ম্যানিফেস্ট রেজিস্ট্রেশনের প্রয়োজন হয় না, যা Android 12+-এ নিষিদ্ধ।
Android 10+-এ, ব্যাকগ্রাউন্ড সীমাবদ্ধতা NetworkCallback কল করতে বিলম্ব বা বাধা দিতে পারে। ব্যাকগ্রাউন্ড কাজের জন্য, NetworkType বাধা সহ WorkManager ব্যবহার করুন — এটি পাওয়ার সেভিং মোড নির্বিশেষে শর্ত পূরণ হলে কাজ সম্পাদনের গ্যারান্টি দেয়।
ConnectivityManager-এ unregisterNetworkCallback পদ্ধতি কল করুন, রেজিস্ট্রেশনের সময় ব্যবহৃত একই কলব্যাক ইনস্ট্যান্স পাস করুন। অপঞ্জীকৃত কলব্যাক মেমরি লিকের কারণ হতে পারে কারণ সিস্টেম তার রেফারেন্স ধরে রাখে। সর্বদা onStop বা onDestroy-এ পঞ্জীকরণ বাতিল করুন।
NetworkCallback API Level 21 (Android 5.0 Lollipop) থেকে উপলব্ধ। পুরানো সংস্করণের ডিভাইসগুলির জন্য, BroadcastReceiver বা সামঞ্জস্য লাইব্রেরি যেমন AndroidX Activity NetworkCallback ব্যবহার করুন, যা বিস্তৃত সমর্থনের জন্য API মোড়ক করে।
ConnectivityManager.getActiveNetwork (API 23+) getNetworkCapabilities-এর সাথে ব্যবহার করুন। পদ্ধতিটি পরিবর্তনে সাবস্ক্রাইব না করেই সিঙ্ক্রোনাসভাবে বর্তমান সক্রিয় নেটওয়ার্ক ফেরত দেয়। API 21-22-এর জন্য, getActiveNetworkInfo ব্যবহার করুন, যা নতুন সংস্করণে ডেপ্রিকেটেড হিসাবে চিহ্নিত।
সারসংক্ষেপ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন