ConnectivityManager
cung cấp
API cho phép bạn yêu cầu thiết bị kết nối với mạng dựa trên
bao gồm cả khả năng của thiết bị và các tuỳ chọn truyền dữ liệu.
Việc triển khai lệnh gọi lại cung cấp thông tin cho ứng dụng của bạn về trạng thái kết nối cũng như khả năng của mạng. API này cho phép bạn xác định xem thiết bị hiện có đang được kết nối với một mạng đáp ứng yêu cầu của ứng dụng.
Định cấu hình yêu cầu mạng
Để chỉ định loại truyền tải của mạng, chẳng hạn như Wi-Fi hoặc mạng di động và khả năng của mạng hiện được kết nối, chẳng hạn như Internet bạn phải định cấu hình yêu cầu mạng.
Khai báo NetworkRequest
mô tả nhu cầu kết nối mạng của ứng dụng. Đoạn mã sau đây sẽ tạo ra một
yêu cầu một mạng được kết nối với Internet và sử dụng Wi-Fi
hoặc kết nối di động cho loại truyền tải.
Kotlin
val networkRequest = NetworkRequest.Builder() .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) .addTransportType(NetworkCapabilities.TRANSPORT_WIFI) .addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR) .build()
Java
NetworkRequest networkRequest = new NetworkRequest.Builder() .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) .addTransportType(NetworkCapabilities.TRANSPORT_WIFI) .addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR) .build();
Lưu ý rằng một số kết nối có thể đắt hơn đáng kể so với các kết nối khác (đối với
ví dụ: kết nối di động thường tốn kém). Sử dụng
NetworkCapabilities#NET_CAPABILITY_NOT_METERED
để xác định xem kết nối có đắt không. Khi sử dụng kết nối có đo lượng dữ liệu,
hãy cố gắng giảm mức tiêu thụ dữ liệu của ứng dụng hoặc trì hoãn ứng dụng cho đến khi thiết bị có
kết nối không có đồng hồ đo.
Định cấu hình lệnh gọi lại mạng
Khi đăng ký NetworkRequest
với ConnectivityManager
, bạn phải
hãy triển khai một
NetworkCallback
để nhận thông báo về những thay đổi về trạng thái kết nối và mạng
các chức năng khác nhau.
Các hàm được triển khai phổ biến nhất trong NetworkCallback
bao gồm
sau:
onAvailable()
cho biết rằng thiết bị được kết nối với mạng mới đáp ứng khả năng và loại truyền tải được quy định trongNetworkRequest
.onLost()
cho biết thiết bị đã mất kết nối mạng.onCapabilitiesChanged()
cho biết khả năng của mạng đã thay đổi. Chiến lược phát hành đĩa đơn Đối tượngNetworkCapabilities
cung cấp thông tin về các khả năng hiện tại của mạng.
Kotlin
private val networkCallback = object : ConnectivityManager.NetworkCallback() { // network is available for use override fun onAvailable(network: Network) { super.onAvailable(network) } // Network capabilities have changed for the network override fun onCapabilitiesChanged( network: Network, networkCapabilities: NetworkCapabilities ) { super.onCapabilitiesChanged(network, networkCapabilities) val unmetered = networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED) } // lost network connection override fun onLost(network: Network) { super.onLost(network) } }
Java
private ConnectivityManager.NetworkCallback networkCallback = new ConnectivityManager.NetworkCallback() { @Override public void onAvailable(@NonNull Network network) { super.onAvailable(network); } @Override public void onLost(@NonNull Network network) { super.onLost(network); } @Override public void onCapabilitiesChanged(@NonNull Network network, @NonNull NetworkCapabilities networkCapabilities) { super.onCapabilitiesChanged(network, networkCapabilities); final boolean unmetered = networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED); } };
Đăng ký nhận thông tin cập nhật về mạng
Sau khi bạn khai báo NetworkRequest
và NetworkCallback
, hãy sử dụng
requestNetwork()
hoặc registerNetworkCallback()
để tìm một mạng để kết nối từ thiết bị đáp ứng
NetworkRequest
. Sau đó, trạng thái sẽ được báo cáo cho NetworkCallback
.
Kotlin
val connectivityManager = getSystemService(ConnectivityManager::class.java) as ConnectivityManager connectivityManager.requestNetwork(networkRequest, networkCallback)
Java
ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(ConnectivityManager.class); connectivityManager.requestNetwork(networkRequest, networkCallback);