Membaca status jaringan (original) (raw)

Android memungkinkan aplikasi mempelajari perubahan dinamis konektivitas. Gunakan kelas berikut untuk melacak dan menanggapi perubahan konektivitas:

Aplikasi tertarik dengan status langsung dari konektivitas kapan pun dapat memanggil metode ConnectivityManager untuk menemukan jenis jaringan apa yang tersedia. Metode ini sangat membantu dalam proses debug dan secara berkala meninjau ringkasan konektivitas yang tersedia kapan saja.

Namun, metodeConnectivityManager sinkron tidak memberi tahu aplikasi Anda tentang apa pun yang terjadi setelah panggilan, sehingga metode ini tidak memungkinkan Anda mengupdate UI. Aplikasi juga tidak dapat menyesuaikan perilaku aplikasi berdasarkan koneksi jaringan atau saat kemampuan jaringan berubah.

Konektivitas dapat berubah kapan saja, dan sebagian besar aplikasi perlu memiliki tampilan status jaringan yang selalu segar dan terbaru di perangkat. Aplikasi dapat mendaftarkan callback dengan ConnectivityManager agar diberitahukan tentang perubahan yang penting bagi aplikasi. Dengan callback, aplikasi Anda dapat langsung bereaksi ke perubahan relevan apa pun di konektivitas tanpa harus melakukan polling mahal yang dapat melewatkan update cepat.

Penggunaan NetworkCallback dan cara lain untuk mengetahui status konektivitas perangkat tidak memerlukan izin tertentu. Namun, beberapa jaringan tunduk pada izin tertentu. Misalnya, mungkin ada jaringan yang dibatasi yang tidak tersedia untuk aplikasi. Melakukan binding ke jaringan latar belakang memerlukan izin CHANGE_NETWORK_STATE. Beberapa panggilan mungkin memerlukan izin khusus agar dapat berjalan. Baca dokumentasi khusus untuk setiap panggilan untuk detailnya.

Mendapatkan status instan

Perangkat yang didukung Android dapat mempertahankan banyak koneksi secara bersamaan. Untuk mendapatkan informasi tentang status jaringan saat ini, pertama-tama dapatkan instance ConnectivityManager:

Kotlin

val connectivityManager = getSystemService(ConnectivityManager::class.java)

Java

ConnectivityManager connectivityManager = getSystemService(ConnectivityManager.class);

Selanjutnya, gunakan instance ini untuk mendapatkan referensi ke jaringan default saat ini untuk aplikasi Anda:

Kotlin

val currentNetwork = connectivityManager.getActiveNetwork()

Java

Network currentNetwork = connectivityManager.getActiveNetwork();

Dengan referensi ke jaringan, aplikasi Anda dapat meminta informasi tentang hal tersebut.

Kotlin

val caps = connectivityManager.getNetworkCapabilities(currentNetwork) val linkProperties = connectivityManager.getLinkProperties(currentNetwork)

Java

NetworkCapabilities caps = connectivityManager.getNetworkCapabilities(currentNetwork); LinkProperties linkProperties = connectivityManager.getLinkProperties(currentNetwork);

Untuk fungsionalitas yang lebih berguna, daftarkanNetworkCallback. Untuk mengetahui informasi selengkapnya tentang mendaftarkan callback jaringan, lihat Memproses peristiwa jaringan.

NetworkCapabilities dan LinkProperties

Objek NetworkCapabilities dan LinkProperties memberikan informasi tentang semua atribut bahwa sistem tahu tentang suatu jaringan.

Objek LinkPropertiestahu tentang rute, alamat link, nama antarmuka, informasi proxy (jika ada), dan server DNS. Panggil metode yang relevan pada objek LinkPropertiesuntuk mengambil informasi yang Anda butuhkan.

Objek NetworkCapabilitiesmengenkapsulasi informasi tentang transport jaringan dan kemampuannya.

Transport adalah abstraksi dari media fisik melalui tempat jaringan beroperasi. Contoh umum transport adalah Ethernet, Wi-Fi, dan seluler. VPN dan Wi-Fi Peer-to-Peer juga dapat ditransfer. Di Android, suatu jaringan dapat memiliki beberapa transport secara bersamaan. Contohnya adalah VPN yang beroperasi melalui jaringan Wi-Fi dan seluler. VPN memiliki transport Wi-Fi, seluler, dan VPN. Untuk mengetahui apakah jaringan memiliki transport tertentu, gunakan metode NetworkCapabilities.hasTransport(int)dengan salah satu konstanta NetworkCapabilities.TRANSPORT_*.

Kemampuan menerangkan properti jaringan. Contoh kemampuan meliputiMMS, NOT_METERED, dan INTERNET. Jaringan dengan kemampuan MMS dapat mengirim dan menerima pesan Multimedia Messaging Service, dan jaringan tanpa kemampuan ini tidak dapat melakukannya. Jaringan dengan kemampuan NOT_METERED tidak menagih pengguna untuk data. Aplikasi Anda dapat memeriksa kemampuan yang sesuai dengan menggunakan metode NetworkCapabilities.hasCapability(int)dengan salah satu konstanta NetworkCapabilities.NET_CAPABILITY_*.

Konstanta NET_CAPABILITY_* yang paling berguna mencakup:

Ada kemampuan lain yang mungkin menarik untuk aplikasi yang lebih khusus. Untuk mengetahui informasi selengkapnya, baca definisi parameter diNetworkCapabilities.hasCapability(int).

Kemampuan jaringan dapat berubah kapan saja. Jika mendeteksi captive portal, sistem akan menampilkan notifikasi yang mengajak pengguna untuk login. Sementara ini sedang berlangsung, jaringan memiliki kemampuan NET_CAPABILITY_INTERNET danNET_CAPABILITY_CAPTIVE_PORTAL, tetapi tidak memiliki kemampuan NET_CAPABILITY_VALIDATED.

Saat pengguna mengambil tindakan dan login ke halaman captive portal, perangkat menjadi dapat mengakses internet publik dan jaringan memperoleh kemampuan NET_CAPABILITY_VALIDATED serta kehilangan kemampuan NET_CAPABILITY_CAPTIVE_PORTAL.

Demikian juga, transport jaringan dapat berubah secara dinamis. Misalnya, VPN dapat mengonfigurasi ulang dirinya sendiri untuk menggunakan jaringan yang lebih cepat yang baru muncul, seperti beralih dari seluler ke Wi-Fi untuk jaringan dasarnya. Dalam hal ini, jaringan kehilangan transport TRANSPORT_CELLULARdan mendapatkan transport TRANSPORT_WIFI, sekaligus mempertahankan transport TRANSPORT_VPN.

Memproses peristiwa jaringan

Untuk mengetahui tentang peristiwa jaringan, gunakan classNetworkCallbackbersamaan denganConnectivityManager.registerDefaultNetworkCallback(NetworkCallback)danConnectivityManager.registerNetworkCallback(NetworkCallback). Kedua metode ini memiliki tujuan yang berbeda.

Semua aplikasi Android memiliki jaringan default, yang ditentukan oleh sistem. Sistem ini biasanya memilih jaringan tidak berbayar dibandingkan yang berbayar dan jaringan yang lebih cepat dibandingkan yang lebih lambat.

Saat aplikasi memberikan permintaan jaringan, seperti denganHttpsURLConnection, sistem memenuhi permintaan ini dengan menggunakan jaringan default. Aplikasi juga dapat mengirimkan traffic di jaringan lain. Untuk mengetahui informasi selengkapnya, lihat bagian tentang jaringan tambahan.

Jaringan yang disetel sebagai jaringan default dapat berubah kapan saja selama masa aktif aplikasi. Contoh umumnya adalah perangkat yang berada dalam jangkauan titik akses Wi-Fi yang aktif, tidak berbayar, dan lebih cepat daripada seluler. Perangkat terhubung ke titik akses ini dan mengalihkan jaringan default untuk semua aplikasi ke jaringan Wi-Fi baru.

Jika jaringan baru menjadi default, semua koneksi baru yang dibuka aplikasi akan menggunakan jaringan ini. Pada waktu tertentu, semua koneksi yang ada di jaringan default sebelumnya akan dihentikan secara paksa. Jika penting bagi aplikasi untuk mengetahui kapan jaringan default berubah, aplikasi harus mendaftarkan callback jaringan default seperti berikut:

Kotlin

connectivityManager.registerDefaultNetworkCallback(object : ConnectivityManager.NetworkCallback() { override fun onAvailable(network : Network) { Log.e(TAG, "The default network is now: " + network) }

override fun onLost(network : Network) {
    Log.e(TAG, "The application no longer has a default network. The last default network was " + network)
}

override fun onCapabilitiesChanged(network : Network, networkCapabilities : NetworkCapabilities) {
    Log.e(TAG, "The default network changed capabilities: " + networkCapabilities)
}

override fun onLinkPropertiesChanged(network : Network, linkProperties : LinkProperties) {
    Log.e(TAG, "The default network changed link properties: " + linkProperties)
}

})

Java

connectivityManager.registerDefaultNetworkCallback(new ConnectivityManager.NetworkCallback() { @Override public void onAvailable(Network network) { Log.e(TAG, "The default network is now: " + network); }

@Override
public void onLost(Network network) {
    Log.e(TAG, "The application no longer has a default network. The last default network was " + network);
}

@Override
public void onCapabilitiesChanged(Network network, NetworkCapabilities networkCapabilities) {
    Log.e(TAG, "The default network changed capabilities: " + networkCapabilities);
}

@Override
public void onLinkPropertiesChanged(Network network, LinkProperties linkProperties) {
    Log.e(TAG, "The default network changed link properties: " + linkProperties);
}

});

Saat jaringan baru menjadi default, aplikasi akan menerima panggilan keonAvailable(Network)untuk jaringan baru. ImplementasikanonCapabilitiesChanged(Network,NetworkCapabilities),onLinkPropertiesChanged(Network,LinkProperties), atau keduanya agar bereaksi dengan sesuai terhadap perubahan konektivitas.

Untuk callback yang didaftarkan dengan registerDefaultNetworkCallback(), onLost()berarti jaringan telah kehilangan status default. Koneksi mungkin terputus.

Meskipun Anda dapat mengetahui tentang transport yang digunakan jaringan default dengan membuat kueriNetworkCapabilities.hasTransport(int), ini adalah proxy yang buruk untuk bandwidth atau nilai berbayar jaringan. Aplikasi Anda tidak boleh berasumsi bahwa Wi-Fi selalu tidak berbayar dan selalu menyediakan bandwidth yang lebih baik daripada seluler.

Sebagai gantinya, gunakanNetworkCapabilities.getLinkDownstreamBandwidthKbps()untuk mengukur bandwidth, danNetworkCapabilites.hasCapability(int)dengan argumenNET_CAPABILITY_NOT_METEREDuntuk menentukan nilai berbayar. Untuk mengetahui informasi selengkapnya, lihat bagian tentang NetworkCapabilities dan LinkProperties.

Secara default, metode callback dipanggil di thread konektivitas aplikasi Anda, yang merupakan thread terpisah yang digunakan oleh ConnectivityManager. Jika implementasi callback Anda perlu melakukan pekerjaan yang lebih lama, panggil callback pada thread pekerja terpisah dengan menggunakan varianConnectivityManager.registerDefaultNetworkCallback(NetworkCallback, Handler).

Batalkan pendaftaran callback jika Anda tidak menggunakannya lagi dengan memanggilConnectivityManager.unregisterNetworkCallback(NetworkCallback). Aktivitas utama Anda di onPause()adalah tempat yang tepat untuk melakukannya, terutama jika Anda mendaftarkan callback dionResume().

Jaringan tambahan (kasus penggunaan lanjutan)

Meskipun jaringan default adalah satu-satunya jaringan yang relevan untuk sebagian besar aplikasi, beberapa aplikasi mungkin tertarik dengan jaringan lain yang tersedia. Untuk mencari tahu tentang hal ini, aplikasi membuat NetworkRequest yang cocok dengan kebutuhan aplikasi dan memanggil ConnectivityManager.registerNetworkCallback(NetworkRequest, NetworkCallback).

Proses ini mirip dengan memantau jaringan default. Namun, walaupun saat hanya ada satu jaringan default yang berlaku kapan pun untuk aplikasi, versi ini memungkinkan aplikasi Anda melihat semua jaringan yang tersedia secara bersamaan, sehingga panggilan ke onLost(Network)berarti jaringan tersebut telah terputus seterusnya, bukan tidak lagi default.

Aplikasi ini membuat NetworkRequest untuk memberi tahu ConnectivityManager jenis jaringan apa yang ingin dipantau. Contoh berikut menunjukkan cara mem-buildNetworkRequest untuk aplikasi yang hanya tertarik dengan koneksi internet yang tidak berbayar:

Kotlin

val request = NetworkRequest.Builder() .addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED) .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) .build()

connectivityManager.registerNetworkCallback(request, myNetworkCallback)

Java

NetworkRequest request = new NetworkRequest.Builder() .addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED) .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) .build();

connectivityManager.registerNetworkCallback(request, myNetworkCallback);

Ini berarti aplikasi Anda mendeteksi semua perubahan terkait jaringan yang tidak berbayar pada sistem.

Untuk callback jaringan default, ada versiregisterNetworkCallback(NetworkRequest, NetworkCallback, Handler)yang menerima Handler sehingga tidak memuat thread Connectivityaplikasi.

PanggilConnectivityManager.unregisterNetworkCallback(NetworkCallback)saat callback tidak relevan lagi. Suatu aplikasi dapat mendaftarkan beberapa callback jaringan secara serentak.

Untuk mempermudah, objek NetworkRequest berisi kemampuan umum yang dibutuhkan sebagian besar aplikasi, termasuk hal berikut:

Saat menulis aplikasi, periksa default untuk melihat apakah cocok dengan kasus penggunaan Anda, dan hapus jika Anda ingin aplikasi diberi tahu tentang jaringan yang tidak memiliki kemampuan ini. Di sisi lain, tambahkan kemampuan agar tidak dipanggil atas perubahan konektivitas apa pun di jaringan yang tidak berinteraksi dengan aplikasi Anda.

Misalnya, jika aplikasi Anda perlu mengirim pesan MMS, tambahkanNET_CAPABILITY_MMSke NetworkRequest agar tidak mendapatkan pemberitahuan tentang semua jaringan yang tidak dapat mengirim pesan MMS. TambahkanTRANSPORT_WIFI_AWAREjika aplikasi Anda hanya tertarik dengan konektivitas Wi-Fi P2P.NET_CAPABILITY_INTERNET danNET_CAPABILITY_VALIDATEDakan berguna jika Anda tertarik dengan kemampuan untuk mentransfer data dengan server di internet.

Contoh urutan callback

Bagian ini menjelaskan urutan callback yang mungkin diperoleh aplikasi jika mendaftarkan callback default dan callback reguler di perangkat yang memiliki konektivitas seluler. Dalam contoh ini, perangkat menghubungkan ke titik akses Wi-Fi yang bagus, lalu memutuskan koneksinya. Contoh ini juga mengasumsikan perangkat mengaktifkan setelan Data seluler selalu aktif.

Linimasa ini adalah sebagai berikut:

  1. Saat aplikasi memanggil registerNetworkCallback(), callback segera menerima panggilan dari onAvailable(), onNetworkCapabilitiesChanged(), danonLinkPropertiesChanged() untuk jaringan seluler, karena hanya jaringan tersebut yang aktif. Jika jaringan lain tersedia, aplikasi juga menerima callback untuk jaringan lainnya.
    Diagram status menunjukkan kejadian callback jaringan terdaftar dan callback yang dipicu oleh kejadian.
    Gambar 1. Status aplikasi setelah memanggil registerNetworkCallback()
  2. Kemudian, aplikasi akan memanggil registerDefaultNetworkCallback(). Callback jaringan default mulai menerima panggilan ke onAvailable(),onNetworkCapabilitiesChanged(), dan onLinkPropertiesChanged() untuk jaringan seluler karena jaringan seluler adalah jaringan default. Jika jaringan non-default lain aktif, aplikasi tidak dapat menerima panggilan untuk jaringan non-default.
    Diagram status menunjukkan kejadian mendaftarkan callback jaringan dan  
callback yang dipicu oleh kejadian.
    Gambar 2. Status aplikasi setelah mendaftarkan jaringan default.
  3. Kemudian, perangkat akan terhubung ke jaringan Wi-Fi (tidak berbayar). Callback jaringan reguler menerima panggilan ke onAvailable(),onNetworkCapabilitiesChanged(), dan onLinkPropertiesChanged() untuk jaringan Wi-Fi.
    Diagram status menunjukkan callback yang dipicu saat aplikasi terhubung ke  
jaringan baru
    Gambar 3. Status aplikasi setelah terhubung ke jaringan Wi-Fi yang tidak berbayar.
  4. Pada saat ini, jaringan Wi-Fi mungkin memerlukan waktu untuk memvalidasi. Dalam hal ini, panggilan onNetworkCapabilitiesChanged() untuk callback jaringan reguler tidak menyertakan kemampuan NET_CAPABILITY_VALIDATED. Setelah beberapa saat, aplikasi akan menerima panggilan ke onNetworkCapabilitiesChanged() yang kemampuan barunya menyertakan NET_CAPABILITY_VALIDATED. Pada umumnya, validasi dilakukan dengan sangat cepat.
    Saat jaringan Wi-Fi memvalidasi, sistem akan memilihnya ke jaringan seluler, terutama karena jaringan tidak berbayar. Jaringan Wi-Fi menjadi jaringan default, sehingga callback jaringan default menerima panggilan keonAvailable(), onNetworkCapabilitiesChanged(), danonLinkPropertiesChanged() untuk jaringan Wi-Fi. Jaringan seluler mengarah ke latar belakang, dan callback jaringan reguler menerima panggilan keonLosing() untuk jaringan seluler.
    Karena contoh ini mengasumsikan data seluler selalu aktif untuk perangkat ini, jaringan seluler tidak akan pernah terputus. Jika setelan dinonaktifkan, jaringan seluler akan terputus setelah beberapa saat, dan callback jaringan reguler akan menerima panggilan ke onLost().
    Diagram status menunjukkan callback yang dipicu saat koneksi jaringan  
Wi-Fi memvalidasi
    Gambar 4. Status aplikasi setelah jaringan Wi-Fi memvalidasi.
  5. Kemudian, perangkat tiba-tiba terputus dari Wi-Fi, karena data berada di luar jangkauan. Karena Wi-Fi terputus, callback jaringan reguler akan menerima panggilan ke onLost() untuk Wi-Fi. Karena seluler adalah jaringan default baru, callback jaringan default menerima panggilan ke onAvailable(),onNetworkCapabilitiesChanged(), dan onLinkPropertiesChanged() untuk jaringan seluler.
    Diagram status menunjukkan callback yang dipicu saat koneksi jaringan  
Wi-Fi terputus
    Gambar 5. Status aplikasi setelah memutuskan koneksi dari jaringan Wi-Fi.

Jika setelan Data seluler selalu aktif dinonaktifkan, saat Wi-Fi terputus, perangkat akan mencoba terhubung kembali ke jaringan seluler. Gambar akan mirip, namun dengan penundaan tambahan yang singkat untuk panggilan onAvailable(), dan callback jaringan reguler juga akan menerima panggilan ke onAvailable(),onNetworkCapabilitiesChanged(), dan onLinkPropertiesChanged() karena seluler akan tersedia.

Batasan penggunaan jaringan untuk transfer data

Dapat melihat jaringan dengan callback jaringan bukan berarti aplikasi Anda dapat menggunakan jaringan untuk transfer data. Beberapa jaringan tidak menyediakan konektivitas internet, dan beberapa jaringan mungkin dibatasi untuk aplikasi dengan hak istimewa. Untuk memeriksa konektivitas internet, lihatNET_CAPABILITY_INTERNETdanNET_CAPABILITY_VALIDATED.

Penggunaan jaringan latar belakang juga bergantung pada pemeriksaan izin. Jika aplikasi Anda ingin menggunakan jaringan latar belakang, aplikasi tersebut memerlukan izinCHANGE_NETWORK_STATE.

Aplikasi dengan izin ini memungkinkan sistem mencoba menampilkan jaringan yang tidak muncul, seperti jaringan seluler saat perangkat terhubung ke jaringan Wi-Fi. Aplikasi tersebut memanggilConnectivityManager.requestNetwork(NetworkRequest, NetworkCallback)dengan NetworkCallback yang akan dipanggil saat jaringan ditampilkan.