Android多个网络连接
Android 5.0 LOLLIPOP (API Level 21)
高级连接
新增的多网络功能允许应用查询可用网络提供的功能,例如它们是 WLAN 网络、蜂窝网络还是按流量计费网络,或者它们是否提供特定网络功能。然后应用可以请求连接并对连接丢失或其他网络变化作出响应。
Android 5.0 提供了新的多网络 API,允许您的应用动态扫描具有特定能力的可用网络,并与它们建立连接。当您的应用需要 SUPL、彩信或运营商计费网络等专业化网络时,或者您想使用特定类型的传输协议发送数据时,就可以使用此功能。
通过以上的Android版本更新文档可以看出,Android 在 5.0 以上的系统中支持了多个网络连接的特性,这个特性让我一下就联想到iOS中的Wi-Fi助理。
Apple Wi-Fi 助理的工作原理
通过 Wi-Fi 助理,即使您的 Wi-Fi 连接信号差,您仍可保持与互联网的连接。例如,如果您在使用 Safari 时因 Wi-Fi 连接信号差而出现网页无法载入的情况,Wi-Fi 助理将激活并自动切换到蜂窝移动网络,以便网页继续载入。您可以将 Wi-Fi 助理与大多数应用(例如,Safari、Apple Music、“邮件”、“地图”等)配合使用。
当 Wi-Fi 助理激活时,您将在设备的状态栏中看到蜂窝移动数据图标。
由于当您的 Wi-Fi 连接信号差时,您将通过蜂窝移动网络保持与互联网的连接,您可能会用掉更多蜂窝移动数据。对于大多数用户,这应只比以往的用量高出很小的比率。如果您对您的数据用量有疑问,请了解有关
管理蜂窝移动数据的更多信息,或者
联系 Apple 支持。
Android 提供的这个特性意味着应用可以选择特定的网络发送网络数据。在用手机上网的时候很可能会遇到这种情况,已经连上了WiFi但是WiFi信号弱或者是该WiFi设备并没有连接到互联网,因此导致网络访问非常的缓慢甚至无法访问网络。但是这个时候手机的移动网络信号可能是非常好的,那么如果是在 Android 5.0 以下的系统上,我们只能关闭手机的WiFi功能,然后使用移动网络重新访问。在 Android 5.0 及以上的系统中有了这个特性之后,意味着应用可以自己处理好这种情况,直接切换到移动网络上面访问,为用户提供更好的体验。话不多说让我们来看一下怎么使用吧
setProcessDefaultNetwork
要从您的应用以动态方式选择并连接网络,请执行以下步骤:
- 创建一个
ConnectivityManager
。 - 使用
NetworkRequest.Builder
类创建一个NetworkRequest
对象,并指定您的应用感兴趣的网络功能和传输类型。 - 要扫描合适的网络,请调用
requestNetwork()
或registerNetworkCallback()
,并传入NetworkRequest
对象和ConnectivityManager.NetworkCallback
的实现。如果您想在检测到合适的网络时主动切换到该网络,请使用requestNetwork()
方法;如果只是接收已扫描网络的通知而不需要主动切换,请改用registerNetworkCallback()
方法。
onAvailable()
回调。您可以使用回调中的
Network
对象来获取有关网络的更多信息,或者引导通信使用所选网络。
app都采用指定的网络
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(
Context.CONNECTIVITY_SERVICE);
NetworkRequest.Builder req = new NetworkRequest.Builder();
req.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR);
cm.requestNetwork(req.build(), new ConnectivityManager.NetworkCallback() {
@Override
public void onAvailable(Network network) {
try {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
ConnectivityManager.setProcessDefaultNetwork(network);
} else {
connectivityManager.bindProcessToNetwork(network);
}
} catch (IllegalStateException e) {
Log.e(TAG, "ConnectivityManager.NetworkCallback.onAvailable: ", e);