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ả chức năng của thiết bị và các tuỳ chọn truyền dữ liệu.
Quá trình triển khai lệnh gọi lại cung cấp thông tin cho ứng dụng về trạng thái kết nối của thiết bị cũng như các chức 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ó được 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ư kết nối Wi-Fi hoặc kết nối di động, và các chức năng của mạng hiện đ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 một NetworkRequest mô tả nhu cầu kết nối mạng của ứng dụng. Mã sau đây tạo một yêu cầu cho mạng được kết nối với Internet và sử dụng kết nối Wi-Fi, Ethernet hoặc di động cho loại truyền tải.
private val networkRequest = NetworkRequest.Builder() .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) .addTransportType(NetworkCapabilities.TRANSPORT_ETHERNET) .addTransportType(NetworkCapabilities.TRANSPORT_WIFI) .addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR) .build()
Xin lưu ý rằng một số kết nối có thể tốn kém 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 cho đến khi thiết bị có kết nối không đ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 NetworkCallback để nhận thông báo về các thay đổi đối với trạng thái kết nối và chức năng mạng.
Các hàm thường được triển khai nhất trong NetworkCallback bao gồm:
onAvailable()cho biết thiết bị đã kết nối với một mạng mới đáp ứng các yêu cầu về chức 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ượngNetworkCapabilitiescung cấp thông tin về các chức năng hiện tại của mạng.
private val networkCallback = object : ConnectivityManager.NetworkCallback() { override fun onAvailable(network: Network) { // Network is available for use. } // Network capabilities have changed for the network. override fun onCapabilitiesChanged( network: Network, networkCapabilities: NetworkCapabilities ) { val unmetered = networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED) if (!unmetered) { // Reduce data usage, or delay it until the network is unmetered. } } override fun onLost(network: Network) { // Lost network connection. } }
Đă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 hàm requestNetwork() hoặc registerNetworkCallback() để tìm kiếm 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.
val connectivityManager = getSystemService(ConnectivityManager::class.java) connectivityManager.registerNetworkCallback(networkRequest, networkCallback)