替换已弃用NetworkInfo API,改用Android非弃用网络API
替换弃用NetworkInfo API的最优方案
你的场景是同步检查当前设备是否有可用网络连接,**ConnectivityManager.getNetworkCapabilities()**是最适配的非弃用API——它能直接获取当前活跃网络的能力状态,无需注册回调(适合单次检查的场景),而NetworkCallback更适合监听网络状态的动态变化,getLinkProperties主要用于获取网络链路的具体属性,并非判断联网状态的首选。
修改后的代码
import android.content.Context; import android.net.ConnectivityManager; import android.net.Network; import android.net.NetworkCapabilities; import android.os.Build; public class ConnectionDetector { private final Context _context; public ConnectionDetector(Context context) { this._context = context.getApplicationContext(); // 使用ApplicationContext避免内存泄漏 } public boolean isConnectingToInternet() { ConnectivityManager connectivityManager = (ConnectivityManager) _context.getSystemService(Context.CONNECTIVITY_SERVICE); if (connectivityManager == null) { return false; } // 适配API 21及以上版本 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { Network activeNetwork = connectivityManager.getActiveNetwork(); if (activeNetwork == null) { return false; } NetworkCapabilities networkCapabilities = connectivityManager.getNetworkCapabilities(activeNetwork); // 检查网络是否具备可访问互联网的有效连接 return networkCapabilities != null && networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) && networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED); } else { // 兼容API 21以下(若项目最低支持版本≥21可删除此分支) //noinspection deprecation android.net.NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo(); return networkInfo != null && networkInfo.isConnected(); } } }
关键说明
- 改用
ApplicationContext避免持有Activity引用引发内存泄漏 - API 21+版本通过
NetworkCapabilities做更严谨的判断:NET_CAPABILITY_VALIDATED确保网络是可正常访问互联网的(排除连接了无网WiFi/热点的情况) - 保留API 21以下的兼容分支(按需取舍)
- 需在
AndroidManifest.xml中添加权限:<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
内容的提问来源于stack exchange,提问作者Eldestornillador
相关产品推荐
相关产品推荐

