NetworkCallback ConnectivityManager کے ذریعے نیٹ ورک کی حالت میں تبدیلیوں کی نگرانی کے لیے Android SDK میں ایک مجرد کلاس ہے۔ 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 سے اس عمل کے لیے مینی فیسٹ رجسٹریشن ہٹانے کا تقاضا کرتی ہے۔
اکثر پوچھے گئے سوالات
CONNECTIVITY_CHANGE کے ساتھ BroadcastReceiver تفصیلات کے بغیر اور کئی سیکنڈ تک کی تاخیر کے ساتھ صرف نیٹ ورک کی تبدیلی کا حقائق فراہم کرتا ہے۔ 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 ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں