📜  activeNetworkInfo depretricated (1)

📅  最后修改于: 2023-12-03 14:39:01.231000             🧑  作者: Mango

Android中activeNetworkInfo被弃用

自API级别29(Android 10)起,activeNetworkInfo已被弃用。此变更是为了更好地反映网络的多样性,以及应用程序在此多样性中运行的方式。 相反,应使用ConnectivityManager.NetworkCallback来监听已连接的网络的状态。

什么是activeNetworkInfo

activeNetworkInfo是一个NetworkInfo对象,表示当前已连接的默认(Active)网络。你可以通过以下方式获得该对象:

ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();

activeNetwork对象描述了连接到系统的网络的信息,例如网络类型(mobile、Wi-Fi等)、是否连接等。

为什么要弃用activeNetworkInfo

在之前的Android版本中,网络连接的类型和状态相对简单,因此提供了activeNetworkInfoAPI来获取当前连接的网络状态。但是,随着Android系统的发展,它的网络变得越来越多样化,比如多个网络接口同时连接的复杂情况变得常见。在这种情况下,为每个网络接口提供单独的activeNetworkInfo会变得越来越不切实际。

为了在这种多样性的网络环境中更好地支持应用程序,Android在API级别29中弃用了activeNetworkInfo,并推荐使用新的网络监听API(ConnectivityManager.NetworkCallback)。

如何替换activeNetworkInfo

如果你的应用程序需要在Android Q及更高版本上运行,你应该把你的代码从使用activeNetworkInfo转换成使用新的API。 以下是如何使用ConnectivityManager.NetworkCallback来监听已连接网络的状态的示例代码:

private NetworkCallback networkCallback = new NetworkCallback() {
    @Override
    public void onAvailable(Network network) {
        // 当网络连接时调用此方法
        // network是一个新连接的Network对象
    }

    @Override
    public void onLost(Network network) {
        // 网络断开时调用此方法
    }
};

private void registerNetworkCallback() {
    ConnectivityManager cm = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
    NetworkRequest request = new NetworkRequest.Builder().build();
    cm.registerNetworkCallback(request, networkCallback);
}

private void unregisterNetworkCallback() {
    ConnectivityManager cm = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
    cm.unregisterNetworkCallback(networkCallback);
}

代码中定义了一个NetworkCallback回调对象,它在连接到网络时调用onAvailable方法,在网络断开时调用onLost方法。这使您可以在需要的情况下检测网络状态,并及时做出反应。为了注册回调对象,您需要创建一个网络请求(使用NetworkRequest.Builder()方法),并通过调用registerNetworkCallback方法将其注册到系统中。记住在不需要它时通过unregisterNetworkCallback()方法注销您的回调对象。

总结

随着Android系统的发展,我们需要在多样化的网络环境中开发应用程序。activeNetworkInfo被弃用是这一发展的体现。而新的API (ConnectivityManager.NetworkCallback)已经为我们提供了更好的方法用于应对多样性的网络环境,并更好地掌握我们应用程序中的网络连接。因此,从API 29起,使用ConnectivityManager.NetworkCallback代替activeNetworkInfo是一个不可或缺的过渡措施。