Theo dõi trạng thái kết nối và định mức kết nối

The 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ột mạng dựa trên nhiều điều kiện, bao gồm các tính năng của thiết bị và các lựa chọn truyền tải 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 của bạn về trạng thái kết nối của thiết bị cũng như các tính 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ó kết nối với một mạng đáp ứng các yêu cầu của ứng dụng hay không.

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 di động) và các tính 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 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 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.

Kotlin

val networkRequest = NetworkRequest.Builder()
        .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
        .addTransportType(NetworkCapabilities.TRANSPORT_ETHERNET)
        .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
        .addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
        .build()

Java

NetworkRequest networkRequest = new 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.

Cấu hình lệnh gọi lại mạng

Khi đăng ký NetworkRequest bằng ConnectivityManager, bạn phải triển khai NetworkCallback để nhận thông báo về những thay đổi trong trạng thái kết nối và các tính năng của mạng.

Sau đây là các hàm thường được triển khai nhất trong NetworkCallback:

  • 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 trong NetworkRequest.
  • onLost() cho biết thiết bị đã mất kết nối với mạng.
  • onCapabilitiesChanged() cho biết các tính năng của mạng đã thay đổi. Đối tượng NetworkCapabilities 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 về mạng

Sau khi khai báo NetworkRequestNetworkCallback, hãy sử dụng các hàm requestNetwork() hoặc registerNetworkCallback() để tìm kiế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);