ConnectivityManager
cung cấp một 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 nhiều điều kiện, bao gồm cả tính năng của thiết bị và tuỳ chọn truyền dữ liệu.
Phương thức triển khai lệnh gọi lại cung cấp cho ứng dụng của bạn thông tin về trạng thái kết nối của thiết bị cũng như khả năng của mạng hiện đang kết nối. API này cho phép bạn xác định xem thiết bị hiện có đang kết nối với mạng đáp ứng các yêu cầu của ứng dụng hay khô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 kết nối di động) và các tính năng của mạng đang kết nối (chẳng hạn như kết nối Internet), bạn phải định cấu hình một 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. Mã sau đây sẽ tạo một yêu cầu cho một mạng được kết nối với Internet và sử dụng kết nối Wi-Fi hoặc kết nối di động cho loại mạng 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();
Xin 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 (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ốn kém hay 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 việc sử dụng kết nối này cho đến khi thiết bị có kết nối không có đo lượng dữ liệu.
Định cấu hình lệnh gọi lại mạng
Khi đăng ký NetworkRequest
với ConnectivityManager
, bạn phải triển khai một NetworkCallback
để nhận thông báo về các thay đổi đối với trạng thái kết nối và các tính năng của mạng.
Các hàm được triển khai phổ biến nhất trong NetworkCallback
bao gồm:
onAvailable()
cho biết thiết bị được kết nối với một mạng mới đáp ứng các yêu cầu về tính năng và loại truyền tải được chỉ định trongNetworkRequest
.onLost()
cho biết thiết bị đã mất kết nối mạng.onCapabilitiesChanged()
cho biết tính năng của mạng đã thay đổi. Đối tượngNetworkCapabilities
cung cấp thông tin về các tính 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 mạng
Sau khi bạn khai báo NetworkRequest
và NetworkCallback
, hãy sử dụng các hàm requestNetwork()
hoặc registerNetworkCallback()
để tìm kiếm một mạng sẽ kết nối từ thiết bị đáp ứng NetworkRequest
. Sau đó, trạng thái này 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);