Android 网络状态检测方法getActiveNetworkInfo已弃用 求替代方案
替代实现方案
使用前请先在AndroidManifest.xml中声明必要权限:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
1. 一次性查询当前网络是否可用
Android 6.0(API 23)及以上官方推荐使用NetworkCapabilities判断网络状态,可兼顾高低版本适配的实现代码如下:
@SuppressWarnings("deprecation") private boolean isNetworkConnected() { ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); if (cm == null) return false; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { Network network = cm.getActiveNetwork(); if (network == null) return false; NetworkCapabilities capabilities = cm.getNetworkCapabilities(network); return capabilities != null && capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) && capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED); } else { // 仅API 23以下的低版本系统会调用该段旧逻辑,不会触发弃用警告 NetworkInfo activeNetworkInfo = cm.getActiveNetworkInfo(); return activeNetworkInfo != null && activeNetworkInfo.isConnected(); } }
其中NET_CAPABILITY_VALIDATED代表当前网络已经完成公网可用性验证,判断结果比旧的isConnected()更准确。
2. 实时监听网络状态变化
如果需要在网络状态变更时自动触发回调,可使用NetworkCallback实现:
private ConnectivityManager.NetworkCallback networkCallback; private void registerNetworkListener() { ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); if (cm == null) return; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { // API 24及以上直接注册默认网络监听即可 networkCallback = new ConnectivityManager.NetworkCallback() { @Override public void onAvailable(@NonNull Network network) { super.onAvailable(network); // 网络可用时的逻辑 } @Override public void onLost(@NonNull Network network) { super.onLost(network); // 网络断开时的逻辑 } }; cm.registerDefaultNetworkCallback(networkCallback); } else { // 低版本适配逻辑 NetworkRequest request = new NetworkRequest.Builder() .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) .build(); networkCallback = new ConnectivityManager.NetworkCallback() { @Override public void onAvailable(@NonNull Network network) { // 网络可用时的逻辑 } @Override public void onLost(@NonNull Network network) { // 网络断开时的逻辑 } }; cm.registerNetworkCallback(request, networkCallback); } } // 页面销毁时必须移除回调,避免内存泄漏 @Override protected void onDestroy() { super.onDestroy(); ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); if (cm != null && networkCallback != null) { cm.unregisterNetworkCallback(networkCallback); } }
内容的提问来源于stack exchange,提问作者user16257123
相关产品推荐
相关产品推荐

