原文 :https://developer.android.google.cn/training/basics/network-ops/managing
本文介绍如何编写对网络资源使用情况进行精细控制的应用。如果App需要执行大量网络操作,应该为用户提供能控制使用数据的设置,例如App同步数据的频率、是否仅在连接到 Wi-Fi 时执行上传/下载、是否在漫游时使用数据等等。为他们提供这些控制后,用户在接近其数据量限制时就不太可能停用应用对后台数据的访问,因为他们可以精确控制应用使用的数据。
注:总之,就是用网络操作大量数据时,应该先问问用户的意见。毕竟流量还是要花小钱钱的。
如需详细了解应用的网络使用情况,包括一段时间内的网络连接数量和类型,请阅读 Web 应用和使用网络分析器检查网络流量。有关如何编写应用以最大限度减少下载和网络连接对电池续航时间的影响的一般准则,请参阅优化电池续航时间和在传输数据的同时节省电量。
您还可以查阅 NetworkConnect 示例。
检查设备的网络连接
我最近就遇到了一个相关的问题:在Android11的小米上,连上热点(一加创建的)后,在已经获取到热点IP的情况下,始终不能建立socket连接。所以这一块还是有坑的。需要研究一下。
设备可以有多种类型的网络连接。本文重点介绍如何使用 Wi-Fi 或移动网络连接。如需查看可能的网络类型的完整列表,请参阅 ConnectivityManager
。
Wi-Fi 速度通常较快。此外,移动数据通常按流量计费,费用可能很高。应用采取的一种常见策略是仅在 Wi-Fi 网络可用时获取大型数据。
在执行网络操作之前,最好先检查网络连接的状态。比如,这可以防止您的应用无意间使用错误的无线装置。如果网络连接不可用,您的应用应该会正常响应。如需检查网络连接,通常使用以下类:
-
ConnectivityManager
:回应关于网络连接状态的查询。当网络连接发生变化时,它还会通知应用。 -
NetworkInfo
:描述指定类型的网络接口的状态(目前为移动网络或 Wi-Fi)。
此代码段会测试 Wi-Fi 和移动网络的网络连接。它确定这些网络接口是否可用(即,是否可以建立网络连接)且/或已连接(即,是否存在网络连接以及是否可以建立socket套接字并传递数据):
注:连上WiFi,也不一定就能建立socket的。所以建立之前是有必要检查一下网络接口是否已连接的。
private const val DEBUG_TAG = "NetworkStatusExample"
...
val connMgr = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
var isWifiConn: Boolean = false
var isMobileConn: Boolean = false
connMgr.allNetworks.forEach { network ->
connMgr.getNetworkInfo(network).apply {
if (type == ConnectivityManager.TYPE_WIFI) {
isWifiConn = isWifiConn or isConnected
}
if (type == ConnectivityManager.TYPE_MOBILE) {
isMobileConn = isMobileConn or isConnected
}
}
}
Log.d(DEBUG_TAG, "Wifi connected: $isWifiConn")
Log.d(DEBUG_TAG, "Mobile connected: $isMobileConn")