Connectivity Manager یک سرویس سیستمی Android است که اطلاعات وضعیت اتصال شبکه دستگاه را در اختیار برنامهها قرار میدهد. این سرویس امکان بررسی وجود اینترنت، تعیین نوع شبکه (Wi-Fi، دادههای موبایل، Ethernet)، ردیابی تغییرات در اتصال و مدیریت درخواستهای شبکه را بر اساس کیفیت ارتباط فراهم میکند. بر اساس Android Developers, 2025، ConnectivityManager API اصلی برای نظارت بر شبکه است و از API Level 1 بخشی از Android Framework میباشد.
نکات کلیدی
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 در کنار WorkManager و Repository برای پیادهسازی معماری Offline-First، بارگذاری تطبیقی محتوا و بهینهسازی عملکرد برنامه بر اساس کیفیت اتصال استفاده میشود.
از Android 10 (API 29)، Google رویکرد کار با ConnectivityManager را تغییر داد. متد getActiveNetworkInfo() منسوخ شده اعلام شد و به جای آن استفاده از registerDefaultNetworkCallback() یا registerNetworkCallback() با NetworkRequest توصیه میشود. API جدید اطلاعات دقیقتری درباره شبکه از جمله امکان تشخیص پورتالهای گیردار (Wi-Fi با احراز هویت) و ارزیابی کیفیت اتصال ارائه میدهد. ConnectivityManager همچنین با خانواده Jetpack یکپارچه شده است: کتابخانه ConnectivityManager در سال 2024 به عنوان بخشی از Jetpack برای سادهسازی نظارت بر شبکه در برنامههای Compose منتشر شد.
در معماری مدرن Android، Connectivity Manager در سطح Repository یا UseCase برای تصمیمگیری درباره درخواستهای شبکه استفاده میشود. Repository Layer وضعیت شبکه را قبل از فراخوانی API بررسی میکند: اگر شبکه در دسترس نباشد، دادهها از حافظه محلی (Room) بازگردانده میشوند. اگر شبکه در دسترس باشد، درخواست به سرور انجام شده و نتیجه در Room ذخیره میشود. ViewModel روی Flow از Room مشترک میشود و از جزئیات تعامل شبکه اطلاعی ندارد — این امکان آزمایش مستقل هر لایه را فراهم میکند.
Connectivity Manager اطلاعات وضعیت شبکه را از سرویس سیستمی connectivity دریافت میکند که با رابطهای شبکه هسته Linux تعامل دارد. وقتی دستگاه به Wi-Fi متصل میشود یا دادههای موبایل را فعال میکند، هسته به سرویس سیستمی اطلاع میدهد که وضعیت داخلی را بهروز کرده و تمام فراخوانهای ثبتشده را مطلع میکند. معماری ConnectivityManager بر اساس الگوی Observer ساخته شده است: برنامه یک NetworkCallback ثبت میکند و در مورد هرگونه تغییر شبکه — ظهور اتصال، قطع آن، تغییر نوع شبکه یا کاهش کیفیت — اعلان دریافت میکند.
API مدرن ConnectivityManager از NetworkRequest برای فیلتر کردن رویدادهای شبکه استفاده میکند. NetworkRequest امکان تعیین الزامات شبکه را فراهم میکند: حملونقل (Transport.WIFI، Transport.CELLULAR، Transport.ETHERNET)، امکان دسترسی به اینترنت (NetworkCapabilities.NET_CAPABILITY_INTERNET) و سایر معیارها. اگر برنامه فقط برای دانلود فایلهای بزرگ به Wi-Fi نیاز دارد، یک NetworkRequest با Transport.WIFI ایجاد کرده و فراخوان را ثبت میکند. سیستم فقط هنگام تغییر اتصال Wi-Fi به برنامه اطلاع میدهد و رویدادهای شبکه موبایل را نادیده میگیرد.
یک ویژگی مهم Connectivity Manager در Android 12+ — شبکه مبتنی بر قابلیتها (capabilities-based networking) است. برنامه نه فقط «آیا اینترنت وجود دارد» را بررسی میکند، بلکه میتواند ارزیابی کند که چه نوع ترافیکی در دسترس است. به عنوان مثال، NET_CAPABILITY_NOT_METERED نشاندهنده اتصال نامحدود (Wi-Fi) است، NET_CAPABILITY_NOT_ROAMING — اینکه دستگاه در رومینگ نیست. این امکان تصمیمگیری را فراهم میکند: دانلود ویدئو فقط از طریق Wi-Fi، به تأخیر انداختن همگامسازی در رومینگ، یا استفاده از دادههای موبایل فقط برای درخواستهای بحرانی.
| API Level | روش توصیهشده | وضعیت |
|---|---|---|
| 1-22 | getActiveNetworkInfo() | منسوخ شده |
| 21+ | NetworkCallback + registerNetworkCallback() | توصیه میشود |
| 24+ | registerDefaultNetworkCallback() | توصیه میشود |
| 28+ | getActiveNetwork() + NetworkCapabilities | جایگزین |
| 31+ | registerBestMatchingNetworkCallback() | API جدید |
برای استفاده از Connectivity Manager در برنامه Android به مجوزهایی نیاز است. ACCESS_NETWORK_STATE — مجوز اجباری برای خواندن اطلاعات شبکه که در AndroidManifest.xml اعلام میشود. بدون این مجوز، ConnectivityManager برای getActiveNetwork() null برمیگرداند و فراخوانها را فراخوانی نمیکند. برای انجام عملیات شبکه نیز مجوز INTERNET لازم است. از Android 10 (API 29)، برنامه میتواند وضعیت شبکه را بدون مجوزهای زمان اجرا اضافی بررسی کند — ACCESS_NETWORK_STATE یک مجوز عادی (normal) است و به طور خودکار هنگام نصب برنامه اعطا میشود.
Connectivity Manager مدرن چندین روش کلیدی برای کار با شبکه ارائه میدهد. getActiveNetwork() (API 23+) شیء Network شبکه فعال فعلی را برمیگرداند یا اگر دستگاه متصل نباشد null. این روش نیازی به فراخوان ندارد و برای بررسی یکباره مناسب است. شیء Network میتواند به NetworkCapabilities منتقل شود تا اطلاعات دقیق دریافت شود: نوع حملونقل، وضعیت metered، رومینگ، امکان دسترسی به اینترنت و سایر ویژگیها.
registerDefaultNetworkCallback() (API 24+) — روش ترجیحی برای نظارت بر شبکه. برنامه یک فراخوان ثبت میکند که در هرگونه تغییر در شبکه پیشفرض (شبکهای که برنامه از طریق آن ترافیک ارسال میکند) فراخوانی میشود. فراخوان شیء Network را دریافت میکند که میتواند برای اتصال سوکتها و کلاینتهای HTTP استفاده شود. این روش جایگزین getActiveNetworkInfo() منسوخ شده میشود و نظارت واکنشی شبکه را بدون polling فراهم میکند.
registerNetworkCallback() (API 21+) امکان اشتراک در تغییرات نوع خاصی از شبکه را از طریق NetworkRequest فراهم میکند. به عنوان مثال، برنامه میتواند فقط شبکههای Wi-Fi را از طریق new NetworkRequest.Builder().addTransportType(NetworkCapabilities.TRANSPORT_WIFI).build() ردیابی کند. سیستم در مورد اتصال/قطع Wi-Fi به برنامه اطلاع میدهد بدون اینکه رویدادهای شبکه موبایل را تحت تأثیر قرار دهد. NetworkCapabilities.getLinkDownstreamBandwidthKbps() تخمین پهنای باند کانال پاییندست را بر حسب kbps برمیگرداند که امکان تطبیق کیفیت محتوا با سرعت اتصال را فراهم میکند.
| روش | حداقل API | هدف |
|---|---|---|
| getActiveNetwork() | 23 | دریافت شبکه فعال فعلی |
| getNetworkCapabilities() | 21 | دریافت قابلیتهای شبکه (نوع، metered، رومینگ) |
| registerDefaultNetworkCallback() | 24 | نظارت بر شبکه پیشفرض |
| registerNetworkCallback() | 21 | نظارت بر شبکهها بر اساس فیلتر NetworkRequest |
| unregisterNetworkCallback() | 21 | لغو ثبت فراخوان |
| getActiveNetworkInfo() | 1 | منسوخ شده، استفاده نکنید |
کتابخانه Jetpack Connectivity (androidx.core:core-ktx) افزونههای مناسبی برای کار با ConnectivityManager در Compose فراهم میکند. تابع ConnectivityManager.observeAsState() یک State
ConnectivityManager.NetworkCallback یک کلاس انتزاعی با متدهایی است که توسط سیستم هنگام تغییر وضعیت شبکه فراخوانی میشوند. onAvailable(Network) — زمانی که شبکه در دسترس میشود فراخوانی میشود. برنامه شیء Network را دریافت میکند که میتواند برای اتصال سوکتها از طریق Network.bindSocket() استفاده شود. onLost(Network) — زمانی که شبکه در دسترس نیست فراخوانی میشود. برنامه باید به دادههای محلی سوئیچ کند یا پیام عدم اتصال را نشان دهد. onCapabilitiesChanged(Network, NetworkCapabilities) — هنگام تغییر ویژگیهای شبکه فراخوانی میشود (مثلاً هنگام سوئیچ از Wi-Fi به دادههای موبایل).
پردازش صحیح تغییرات شبکه نیازمند توجه به چرخه حیات کامپوننت است. فراخوان باید ثبت شود در onStart()/onResume() و لغو شود در onStop()/onPause(). اگر فراخوان لغو نشود، ممکن است پس از نابودی Activity همچنان فراخوانی شود که منجر به نشت حافظه میشود. در معماری Jetpack ViewModel توصیه میشود از lifecycleScope برای ثبت فراخوان استفاده شود تا به طور خودکار هنگام پاکسازی ViewModel لغو شود. برای سرویسها و وظایف پسزمینه از WorkManager با محدودیت NetworkType استفاده میشود.
پردازش پورتالهای گیردار — یک قابلیت مهم ConnectivityManager از Android 10. CAPTIVE_PORTAL — سناریویی که شبکه Wi-Fi در دسترس است اما نیاز به احراز هویت از طریق صفحه وب دارد (فرودگاهها، هتلها، کافهها). NetworkCapabilities.NET_CAPABILITY_VALIDATED نشان میدهد که شبکه دسترسی کامل به اینترنت دارد. اگر NET_CAPABILITY_VALIDATED وجود نداشته باشد، برنامه میتواند مرورگر را برای احراز هویت از طریق پورتال گیردار باز کند. برای تشخیص پورتال گیردار از متد isCaptivePortal() که در Android 11 (API 30) اضافه شده استفاده میشود.
ConnectivityManager امکان درخواست شبکه برای اهداف خاص را از طریق requestNetwork() و bindProcessToNetwork() فراهم میکند. به عنوان مثال، برنامه برای دانلود فایلهای بزرگ میتواند شبکه Wi-Fi را حتی اگر شبکه موبایل فعال است درخواست کند. برای این کار یک NetworkRequest با addTransportType(TRANSPORT_WIFI) ایجاد میشود و هنگام ظهور Wi-Fi سیستم onAvailable() را فراخوانی میکند. برنامه سوکتها را با این شبکه از طریق network.bindSocket() یا OkHttp با شیء Network پیکربندیشده متصل میکند. این کنترل انعطافپذیری بر استفاده از رابطهای شبکه فراهم میکند.
بیایید یک مثال کامل از استفاده ConnectivityManager با API مدرن (NetworkCallback) در معماری Clean Architecture بررسی کنیم. NetworkMonitor — کلاس wrapper بر روی ConnectivityManager که وضعیت شبکه واکنشی را از طریق StateFlow ارائه میدهد. ViewModel روی این Flow مشترک میشود و وضعیت را به UI منتقل میکند. Repository از NetworkMonitor برای تصمیمگیری درباره درخواستهای شبکه استفاده میکند. این رویکرد تستپذیری و جداسازی وابستگیهای پلتفرمی را تضمین میکند.
مثال زیر نحوه استفاده صحیح از ConnectivityManager با registerDefaultNetworkCallback را نشان میدهد. کلاس NetworkMonitor کار با سرویس سیستمی را کپسوله میکند و یک Kotlin Flow
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 روی NetworkMonitor.isOnline از طریق stateIn() مشترک میشود و وضعیت را به Compose منتقل میکند. Repository مقدار فعلی isOnline.value را قبل از فراخوانی API بررسی میکند: اگر false باشد — Flow از Room برمیگرداند. اگر true باشد — API را فراخوانی میکند، نتیجه را در Room ذخیره کرده و Flow از Room برمیگرداند. WorkManager از NetworkType.CONNECTED برای محدود کردن وظایف پسزمینه استفاده میکند. آزمایش NetworkMonitor با شیء mock ConnectivityManager و fake NetworkCallback انجام میشود که امکان شبیهسازی هر سناریوی شبکه را در تستهای واحد فراهم میکند.
اولین قانون کار با ConnectivityManager — استفاده نکردن از API منسوخ شده است. getActiveNetworkInfo() از API 29 منسوخ شده و ممکن است در نسخههای جدید Android دادههای نادرست بازگرداند. به جای آن از getActiveNetwork() + getNetworkCapabilities() برای بررسی یکباره و از registerDefaultNetworkCallback() برای نظارت پیوسته استفاده کنید. روش قدیمی همچنین شبکههای با پورتال گیردار و اینترنت کامل را تشخیص نمیدهد که منجر به فعالسازیهای نادرست میشود.
دومین قانون — همیشه ثبت فراخوان را لغو کنید. اگر Activity یک NetworkCallback را در onStart() ثبت کند اما در 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 — ترکیب قابل اعتمادی است: ابتدا وجود شبکه بررسی میشود، سپس یک درخواست سبک به سرور برای تأیید دسترسی واقعی انجام میشود.
برای تستهای واحد از Robolectric با ShadowConnectivityManager استفاده کنید که امکان شبیهسازی وضعیت شبکه را فراهم میکند. برای تستهای یکپارچه — Android Test Orchestrator با تغییر حالت Airplane Mode. در تستها سناریوها را بررسی کنید: انتقال از آنلاین به آفلاین، ظهور Wi-Fi هنگام فعال بودن شبکه موبایل، قطع شبکه هنگام اجرای درخواست، پورتال گیردار، رومینگ. برای mocking در تستهای ماژولار از یک رابط wrapper (مثلاً NetworkMonitorInterface) استفاده کنید که میتواند با شیء mock بدون وابستگیهای پلتفرمی جایگزین شود.
سوالات متداول
روش مدرن — استفاده از registerDefaultNetworkCallback() با بررسی NET_CAPABILITY_INTERNET در onCapabilitiesChanged(). برای بررسی یکباره: connectivityManager.getActiveNetwork()?.let { caps -> caps.hasCapability(NET_CAPABILITY_INTERNET) } ?: false. روش منسوخ شده getActiveNetworkInfo() از API 29+ توصیه نمیشود.
برای خواندن اطلاعات شبکه مجوز android.permission.ACCESS_NETWORK_STATE لازم است. این یک مجوز عادی (normal permission) است — هنگام نصب برنامه به طور خودکار اعطا میشود و نیاز به درخواست زمان اجرا ندارد. برای انجام عملیات شبکه (درخواستهای HTTP) نیز مجوز INTERNET لازم است.
registerDefaultNetworkCallback() شبکه پیشفرض را ردیابی میکند — شبکهای که برنامه از طریق آن ترافیک اصلی را ارسال میکند. registerNetworkCallback(NetworkRequest) شبکههای منطبق با فیلتر مشخص را ردیابی میکند (مثلاً فقط Wi-Fi). Default callback سادهتر است و 90% سناریوها را پوشش میدهد، request سفارشی برای نیازهای خاص به نوع شبکه است.
از NetworkCapabilities استفاده کنید: caps.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) برای Wi-Fi، hasTransport(TRANSPORT_CELLULAR) برای دادههای موبایل. از ConnectivityManager.getActiveNetworkInfo().getType() استفاده نکنید — این روش منسوخ شده است. NetworkCapabilities از طریق connectivityManager.getNetworkCapabilities(network) قابل دسترسی است.
getActiveNetworkInfo() به دلیل عدم دقت منسوخ شده است: این روش شبکههای با پورتال گیردار و اینترنت کامل را تشخیص نمیدهد، اطلاعاتی درباره پهنای باند و رومینگ ارائه نمیدهد. از Android 10، این روش ممکن است برای اتصالات چندکاناله (multi-network) null یا دادههای نادرست بازگرداند. جایگزین — getActiveNetwork() + NetworkCapabilities.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید