我的应用程序执行一些背景数据收集,我正在添加对用户网络首选项的支持,例如执行后台更新和数据漫游。我已经有以下检查:
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
if(cm.getBackgroundDataSetting()) {
...
NetworkInfo networkInfo = cm.getActiveNetworkInfo();
if (networkInfo != null && networkInfo.isAvailable() && networkInfo.isConnected()) {
包含清单中的必填项:
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
这一切看起来都很好,但我想知道我是否应该检查其他内容?我担心检查数据漫游,但docs状态networkInfo.isAvailable()
为我检查这一点。那么我需要为网络设置实施任何其他检查吗?我应该注意这个领域的其他任何事情吗?
答案 0 :(得分:6)
用户可以在后台应用运行时更改设置。 API建议您收听广播消息:
ConnectivityManager.ACTION_BACKGROUND_DATA_SETTING_CHANGED
也许你在发送数据之前检查cm.getBackgroundDataSetting(),我怀疑这就足够了。但是,收听广播消息可让您在更改设置时恢复发送背景数据。
我相信在发送数据之前收听广播消息或检查设置就足够了。 Android docs推荐前者。
答案 1 :(得分:6)
除了您的检查,我还会检查3g网络的漫游状态:
NetworkInfo info = m_connectivityManager.getActiveNetworkInfo();
int netType = info.getType();
int netSubtype = info.getSubtype();
if (netType == ConnectivityManager.TYPE_WIFI || netType == ConnectivityManager.TYPE_WIMAX)
{
//no restrictions, do some networking
}
else if (netType == ConnectivityManager.TYPE_MOBILE &&
netSubtype == TelephonyManager.NETWORK_TYPE_UMTS)
{
//3G connection
if(!m_telephonyManager.isNetworkRoaming())
{
//do some networking
}
}
我的应用程序使用大量数据,因此我不允许在非3G移动网络上下载数据。
答案 2 :(得分:2)
与@inazaruk一样,我也试图在仅在GPRS上漫游或下载图像时阻止(对于用户可能很昂贵的)网络传输。因此,在Zwitscher我实现了一个NetworkHelper,它检查用户对romaing和最小网络状态的偏好; https://github.com/pilhuhn/ZwitscherA/blob/master/src/de/bsd/zwitscher/helper/NetworkHelper.java 匹配首选项位于:https://github.com/pilhuhn/ZwitscherA/blob/master/res/xml/preferences.xml#L30