如何尊重Android中的网络使用设置

时间:2011-01-08 15:39:36

标签: android

我的应用程序执行一些背景数据收集,我正在添加对用户网络首选项的支持,例如执行后台更新和数据漫游。我已经有以下检查:

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()为我检查这一点。那么我需要为网络设置实施任何其他检查吗?我应该注意这个领域的其他任何事情吗?

3 个答案:

答案 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