如何基于ConnectivityManager获取的原网络信息构建NetworkRequest恢复历史连接
直接绑定原网络的可行性
你完全可以跳过网络请求步骤,直接绑定已经获取到的defaultNetwork对象,只要该网络还处于活跃状态即可:
- 先验证原网络有效性:调用
connectivityManager.getNetworkCapabilities(defaultNetwork),如果返回值不为null,说明网络仍存活 - 直接执行
connectivityManager.bindProcessToNetwork(defaultNetwork)即可完成切回,不需要额外构造请求
构造NetworkRequest的方案
如果原网络已经被系统断开(验证时返回null),需要重新请求匹配的同规格网络,不需要遍历所有defaultCapabilities添加,仅需添加核心匹配条件即可,避免冗余的系统私有能力导致匹配失败,示例代码如下:
// Java 示例代码 if (defaultCapabilities != null) { NetworkRequest.Builder builder = new NetworkRequest.Builder(); // 1. 添加原网络的传输类型(WiFi/蜂窝/以太网等) int[] transportTypes = { NetworkCapabilities.TRANSPORT_WIFI, NetworkCapabilities.TRANSPORT_CELLULAR, NetworkCapabilities.TRANSPORT_ETHERNET, NetworkCapabilities.TRANSPORT_BLUETOOTH }; for (int transport : transportTypes) { if (defaultCapabilities.hasTransport(transport)) { builder.addTransportType(transport); break; } } // 2. 添加核心网络能力,按需扩展你业务需要的能力即可 builder.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET); // 3. 构建请求并发起 NetworkRequest defaultRequest = builder.build(); connectivityManager.requestNetwork(defaultRequest, defaultCallback); }
额外注意事项
- 网络请求的回调使用完成后,必须调用
connectivityManager.unregisterNetworkCallback(defaultCallback)注销,避免内存泄漏 - 整个逻辑需要提前申请
ACCESS_NETWORK_STATE权限,否则无法获取网络信息、执行绑定操作
内容的提问来源于stack exchange,提问作者Sarah
相关产品推荐
相关产品推荐

