Connectivity Manager — adalah layanan sistem Android yang memberikan informasi kepada aplikasi tentang status koneksi jaringan perangkat. Ini memungkinkan untuk memeriksa keberadaan internet, menentukan jenis jaringan (Wi-Fi, data seluler, Ethernet), melacak perubahan koneksi dan mengelola permintaan jaringan tergantung pada kualitas komunikasi. Menurut Android Developers, 2025, ConnectivityManager adalah API utama untuk pemantauan jaringan dan merupakan bagian dari Android Framework sejak API Level 1.
Poin utama
ConnectivityManager — adalah layanan sistem dari sistem operasi Android, dapat diakses melalui Context.getSystemService(Context.CONNECTIVITY_SERVICE). Ini menyediakan API untuk mendapatkan informasi tentang koneksi jaringan perangkat, memantau perubahan jaringan, dan mengelola permintaan jaringan aplikasi. Connectivity Manager telah menjadi bagian dari Android Framework sejak versi pertama platform (API Level 1) dan selama beberapa dekade telah mengalami perubahan signifikan: dari getActiveNetworkInfo() sederhana hingga model reaktif modern dengan NetworkCallback dan NetworkRequest.
Kemampuan utama Connectivity Manager meliputi: memeriksa keberadaan koneksi jaringan aktif, menentukan jenis jaringan (Wi-Fi, data seluler, Ethernet, Bluetooth, VPN), memantau perubahan status jaringan secara real-time, mendapatkan informasi tentang bandwidth dan latensi, mengelola permintaan jaringan aplikasi. ConnectivityManager digunakan bersama dengan WorkManager dan Repository untuk mengimplementasikan arsitektur Offline-First, pemuatan konten adaptif, dan optimalisasi kerja aplikasi tergantung pada kualitas koneksi.
Mulai dari Android 10 (API 29), Google mengubah pendekatan kerja dengan ConnectivityManager. Metode getActiveNetworkInfo() dinyatakan deprecated, dan sebagai gantinya direkomendasikan menggunakan registerDefaultNetworkCallback() atau registerNetworkCallback() dengan NetworkRequest. API baru memberikan informasi lebih detail tentang jaringan, termasuk kemampuan mendeteksi captive portal (Wi-Fi dengan otentikasi) dan mengevaluasi kualitas koneksi. ConnectivityManager juga terintegrasi dengan keluarga Jetpack: pustaka ConnectivityManager dirilis pada tahun 2024 sebagai bagian dari Jetpack untuk menyederhanakan pemantauan jaringan di aplikasi Compose.
Dalam arsitektur Android modern, Connectivity Manager digunakan di tingkat repository atau UseCase untuk mengambil keputusan tentang permintaan jaringan. Lapisan Repository memeriksa status jaringan sebelum memanggil API: jika jaringan tidak tersedia, data dikembalikan dari penyimpanan lokal (Room). Jika jaringan tersedia, permintaan ke server dieksekusi dan hasilnya disimpan di Room. ViewModel berlangganan ke Flow dari Room dan tidak mengetahui detail interaksi jaringan — ini memungkinkan pengujian setiap lapisan secara independen.
Connectivity Manager menerima informasi tentang status jaringan dari layanan sistem connectivity, yang berkomunikasi dengan antarmuka jaringan kernel Linux. Ketika perangkat terhubung ke Wi-Fi atau mengaktifkan data seluler, kernel memberitahu layanan sistem, yang memperbarui status internal dan memberitahu semua callback yang terdaftar. Arsitektur ConnectivityManager dibangun pada pola Observer: aplikasi mendaftarkan NetworkCallback dan menerima pemberitahuan tentang perubahan jaringan — munculnya koneksi, kehilangannya, perubahan jenis jaringan atau penurunan kualitas.
API modern ConnectivityManager menggunakan NetworkRequest untuk memfilter peristiwa jaringan. NetworkRequest memungkinkan menentukan persyaratan untuk jaringan: transport (Transport.WIFI, Transport.CELLULAR, Transport.ETHERNET), kemampuan akses internet (NetworkCapabilities.NET_CAPABILITY_INTERNET) dan kriteria lainnya. Jika aplikasi hanya membutuhkan Wi-Fi untuk mengunduh file besar, ia membuat NetworkRequest dengan Transport.WIFI dan mendaftarkan callback. Sistem akan memberitahu aplikasi hanya saat perubahan koneksi Wi-Fi, mengabaikan peristiwa jaringan seluler.
Fitur penting Connectivity Manager di Android 12+ — jaringan berbasis kemampuan (capabilities-based networking). Aplikasi tidak hanya memeriksa "apakah ada internet", tetapi dapat mengevaluasi jenis lalu lintas apa yang tersedia. Misalnya, NET_CAPABILITY_NOT_METERED menunjukkan koneksi tak terbatas (Wi-Fi), NET_CAPABILITY_NOT_ROAMING — bahwa perangkat tidak dalam roaming. Ini memungkinkan pengambilan keputusan: memuat video hanya melalui Wi-Fi, menunda sinkronisasi saat roaming, atau menggunakan data seluler hanya untuk permintaan kritis.
| API Level | Metode yang direkomendasikan | Status |
|---|---|---|
| 1-22 | getActiveNetworkInfo() | Deprecated |
| 21+ | NetworkCallback + registerNetworkCallback() | Direkomendasikan |
| 24+ | registerDefaultNetworkCallback() | Direkomendasikan |
| 28+ | getActiveNetwork() + NetworkCapabilities | Alternatif |
| 31+ | registerBestMatchingNetworkCallback() | API baru |
Untuk menggunakan Connectivity Manager di aplikasi Android diperlukan izin. ACCESS_NETWORK_STATE — izin wajib untuk membaca informasi jaringan, dideklarasikan di AndroidManifest.xml. Tanpa izin ini, ConnectivityManager akan mengembalikan null untuk getActiveNetwork() dan tidak akan memanggil callback. Untuk melakukan operasi jaringan juga diperlukan izin INTERNET. Mulai dari Android 10 (API 29), aplikasi dapat memeriksa status jaringan tanpa izin runtime tambahan — ACCESS_NETWORK_STATE adalah izin normal (normal permission) dan diberikan secara otomatis saat instalasi.
Connectivity Manager modern menyediakan beberapa metode kunci untuk bekerja dengan jaringan. getActiveNetwork() (API 23+) mengembalikan objek Network dari jaringan aktif saat ini atau null jika perangkat tidak terhubung. Metode ini tidak memerlukan callback dan cocok untuk pemeriksaan satu kali. Objek Network dapat diteruskan ke NetworkCapabilities untuk mendapatkan informasi detail: jenis transport, status metered, roaming, kemampuan akses internet dan karakteristik lainnya.
registerDefaultNetworkCallback() (API 24+) — cara yang disukai untuk memantau jaringan. Aplikasi mendaftarkan callback yang dipanggil saat ada perubahan pada jaringan default (jaringan yang digunakan aplikasi untuk mengirim lalu lintas). Callback menerima objek Network yang dapat digunakan untuk mengikat soket dan klien HTTP. Metode ini menggantikan getActiveNetworkInfo() yang usang dan menyediakan pemantauan jaringan reaktif tanpa polling.
registerNetworkCallback() (API 21+) memungkinkan berlangganan perubahan jenis jaringan tertentu melalui NetworkRequest. Misalnya, aplikasi dapat melacak hanya jaringan Wi-Fi melalui new NetworkRequest.Builder().addTransportType(NetworkCapabilities.TRANSPORT_WIFI).build(). Sistem akan memberi tahu aplikasi tentang koneksi/pemutusan Wi-Fi tanpa memengaruhi peristiwa jaringan seluler. NetworkCapabilities.getLinkDownstreamBandwidthKbps() mengembalikan perkiraan bandwidth saluran downstream dalam kbps, memungkinkan penyesuaian kualitas konten dengan kecepatan koneksi.
| Metode | API minimal | Tujuan |
|---|---|---|
| getActiveNetwork() | 23 | Mendapatkan jaringan aktif saat ini |
| getNetworkCapabilities() | 21 | Mendapatkan kemampuan jaringan (jenis, metered, roaming) |
| registerDefaultNetworkCallback() | 24 | Memantau jaringan default |
| registerNetworkCallback() | 21 | Memantau jaringan berdasarkan filter NetworkRequest |
| unregisterNetworkCallback() | 21 | Membatalkan pendaftaran callback |
| getActiveNetworkInfo() | 1 | Usang (deprecated), jangan digunakan |
Pustaka Jetpack Connectivity (androidx.core:core-ktx) menyediakan ekstensi yang nyaman untuk bekerja dengan ConnectivityManager di Compose. Fungsi ConnectivityManager.observeAsState() mengembalikan State<Boolean> yang diperbarui saat jaringan berubah. Komponen @Composable NetworkStatus() menampilkan status koneksi dan secara otomatis digambar ulang saat ada perubahan. Ini membebaskan pengembang dari pengelolaan callback dan siklus hidup Activity/Fragment secara manual.
ConnectivityManager.NetworkCallback — adalah kelas abstrak dengan metode yang dipanggil oleh sistem saat perubahan status jaringan. onAvailable(Network) — dipanggil ketika jaringan tersedia. Aplikasi menerima objek Network yang dapat digunakan untuk mengikat soket melalui Network.bindSocket(). onLost(Network) — dipanggil ketika jaringan tidak tersedia. Aplikasi harus beralih ke data lokal atau menampilkan pesan tentang tidak adanya koneksi. onCapabilitiesChanged(Network, NetworkCapabilities) — dipanggil saat perubahan karakteristik jaringan (misalnya, saat beralih dari Wi-Fi ke data seluler).
Penanganan perubahan jaringan yang benar memerlukan pertimbangan siklus hidup komponen. Callback harus didaftarkan di onStart()/onResume() dan dibatalkan di onStop()/onPause(). Jika callback tidak dibatalkan, ia dapat dipanggil setelah Activity dihancurkan, yang menyebabkan kebocoran memori. Dalam arsitektur Jetpack ViewModel, disarankan menggunakan lifecycleScope untuk mendaftarkan callback agar otomatis dibatalkan saat pembersihan ViewModel. Untuk layanan dan tugas latar belakang, WorkManager digunakan dengan batasan NetworkType.
Penanganan captive portal — kemampuan penting ConnectivityManager mulai Android 10. CAPTIVE_PORTAL — skenario ketika jaringan Wi-Fi tersedia tetapi memerlukan otentikasi melalui halaman web (bandara, hotel, kafe). NetworkCapabilities.NET_CAPABILITY_VALIDATED menunjukkan bahwa jaringan memiliki akses internet penuh. Jika NET_CAPABILITY_VALIDATED tidak ada, aplikasi dapat membuka browser untuk otentikasi melalui captive portal. Untuk mendeteksi captive portal digunakan metode isCaptivePortal(), ditambahkan di Android 11 (API 30).
ConnectivityManager memungkinkan meminta jaringan untuk tujuan tertentu melalui requestNetwork() dan bindProcessToNetwork(). Misalnya, aplikasi untuk mengunduh file besar dapat meminta jaringan Wi-Fi bahkan jika jaringan seluler aktif. Untuk ini, NetworkRequest dibuat dengan addTransportType(TRANSPORT_WIFI), dan ketika Wi-Fi muncul, sistem memanggil onAvailable(). Aplikasi mengikat soket ke jaringan ini melalui network.bindSocket() atau OkHttp dengan objek Network yang dikonfigurasi. Ini memberikan kontrol fleksibel atas penggunaan antarmuka jaringan.
Mari kita lihat contoh lengkap penggunaan ConnectivityManager dengan API modern (NetworkCallback) dalam arsitektur Clean Architecture. NetworkMonitor — kelas pembungkus di atas ConnectivityManager yang menyediakan status jaringan reaktif melalui StateFlow. ViewModel berlangganan ke Flow ini dan meneruskan status ke UI. Repository menggunakan NetworkMonitor untuk mengambil keputusan tentang permintaan jaringan. Pendekatan ini memastikan testabilitas dan isolasi ketergantungan platform.
Contoh di bawah menunjukkan cara menggunakan ConnectivityManager dengan registerDefaultNetworkCallback dengan benar. Kelas NetworkMonitor mengenkapsulasi pekerjaan dengan layanan sistem dan menyediakan Kotlin Flow<Boolean> yang bersih. Ia mendaftarkan callback saat startup dan membatalkannya saat siklus hidup berakhir. Pekerjaan asinkron disediakan melalui coroutine dan callbackFlow — jembatan antara gaya callback ConnectivityManager dan gaya Flow reaktif 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 berlangganan NetworkMonitor.isOnline melalui stateIn() dan meneruskan status ke Compose. Repository memeriksa nilai saat ini dari isOnline.value sebelum memanggil API: jika false — mengembalikan Flow dari Room. Jika true — memanggil API, menyimpan hasil di Room dan mengembalikan Flow dari Room. WorkManager menggunakan NetworkType.CONNECTED untuk membatasi tugas latar belakang. Pengujian NetworkMonitor dilakukan dengan objek mock ConnectivityManager dan fake NetworkCallback, memungkinkan emulasi skenario jaringan apa pun dalam pengujian unit.
Aturan pertama bekerja dengan ConnectivityManager — jangan gunakan API yang usang. getActiveNetworkInfo() sudah deprecated sejak API 29 dan dapat mengembalikan data yang tidak akurat pada versi Android baru. Sebagai gantinya, gunakan getActiveNetwork() + getNetworkCapabilities() untuk pemeriksaan satu kali dan registerDefaultNetworkCallback() untuk pemantauan terus-menerus. Metode lama tidak membedakan jaringan dengan captive portal dan internet penuh, yang menyebabkan hasil positif palsu.
Aturan kedua — selalu batalkan pendaftaran callback. Jika Activity mendaftarkan NetworkCallback di onStart() tetapi tidak membatalkannya di onStop(), callback terus berfungsi setelah Activity dihancurkan. Ini menyebabkan kebocoran memori dan potensi NullPointerException ketika callback mencoba memperbarui UI komponen yang dihancurkan. Gunakan lifecycleScope atau repeatOnLifecycle untuk manajemen pendaftaran otomatis. Di Jetpack Compose, gunakan DisposableEffect untuk mendaftarkan dan membatalkan callback.
Kesalahan umum ketiga — hanya memeriksa keberadaan jaringan tanpa mempertimbangkan kualitasnya. Sekadar "ada internet" tidak cukup untuk pengambilan keputusan. Aplikasi harus memeriksa NET_CAPABILITY_NOT_METERED untuk mengunduh file besar, NET_CAPABILITY_NOT_ROAMING untuk sinkronisasi latar belakang, NET_CAPABILITY_VALIDATED untuk konfirmasi akses internet. Mengabaikan flag ini menyebabkan aplikasi mencoba memuat video saat roaming atau menyinkronkan data melalui captive portal hotel.
Keempat — jangan gunakan ConnectivityManager untuk memeriksa ketersediaan server tertentu. ConnectivityManager melaporkan status jaringan di perangkat, tetapi tidak menjamin server tersedia. Untuk memeriksa ketersediaan API, gunakan permintaan HTTP dengan timeout pendek atau Health Check. ConnectivityManager + ping HTTP adalah kombinasi yang andal: pertama, keberadaan jaringan diperiksa, kemudian permintaan ringan dikirim ke server untuk mengonfirmasi ketersediaan sebenarnya.
Untuk pengujian unit, gunakan Robolectric dengan ShadowConnectivityManager, yang memungkinkan emulasi status jaringan. Untuk pengujian integrasi — Android Test Orchestrator dengan mengganti Mode Pesawat. Dalam pengujian, periksa skenario: transisi dari online ke offline, munculnya Wi-Fi saat jaringan seluler aktif, kehilangan jaringan selama permintaan, captive portal, roaming. Untuk mocking dalam pengujian modular, gunakan antarmuka pembungkus (misalnya, NetworkMonitorInterface) yang dapat diganti dengan objek mock tanpa ketergantungan platform.
Pertanyaan yang sering diajukan
Cara modern — gunakan registerDefaultNetworkCallback() dengan pemeriksaan NET_CAPABILITY_INTERNET di onCapabilitiesChanged(). Untuk pemeriksaan satu kali: connectivityManager.getActiveNetwork()?.let { caps -> caps.hasCapability(NET_CAPABILITY_INTERNET) } ?: false. Metode usang getActiveNetworkInfo() tidak direkomendasikan sejak API 29+.
Untuk membaca informasi jaringan diperlukan izin android.permission.ACCESS_NETWORK_STATE. Ini adalah izin normal (normal permission) — diberikan secara otomatis saat instalasi aplikasi dan tidak memerlukan permintaan runtime. Untuk melakukan operasi jaringan (permintaan HTTP) juga diperlukan izin INTERNET.
registerDefaultNetworkCallback() melacak jaringan default — jaringan yang digunakan aplikasi untuk mengirim lalu lintas utama. registerNetworkCallback(NetworkRequest) melacak jaringan yang sesuai dengan filter yang ditentukan (misalnya, hanya Wi-Fi). Callback default lebih sederhana dan mencakup 90% skenario, request kustom untuk persyaratan khusus jenis jaringan.
Gunakan NetworkCapabilities: caps.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) untuk Wi-Fi, hasTransport(TRANSPORT_CELLULAR) untuk data seluler. Jangan gunakan ConnectivityManager.getActiveNetworkInfo().getType() — metode ini sudah deprecated. NetworkCapabilities tersedia melalui connectivityManager.getNetworkCapabilities(network).
getActiveNetworkInfo() sudah usang karena ketidakakuratan: tidak membedakan jaringan dengan captive portal dan internet penuh, tidak memberikan informasi tentang bandwidth dan roaming. Mulai Android 10, metode ini dapat mengembalikan null atau data yang salah untuk koneksi multi-jaringan (multi-network). Pengganti — getActiveNetwork() + NetworkCapabilities.
Ringkasan
Kami akan mengembangkan aplikasi seluler turnkey
IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.
Baca juga