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

如何尊重Android中的网络使用设置,android,Android,我的应用程序执行一些后台数据收集,我正在添加对用户网络首选项的支持,例如执行后台更新和数据漫游。我已经有了以下支票: ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); if(cm.getBackgroundDataSetting()) { ... NetworkInfo networkInfo = cm.getActiveNetworkInf

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

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>


这一切似乎都很好,但我想知道我是否应该检查其他东西?我担心检查数据漫游,但
networkInfo.isAvailable()
的状态会帮我检查。那么,我还需要对网络设置执行其他检查吗?这方面还有什么我应该知道的吗?

用户可以在后台应用程序运行时更改设置。API建议您收听广播消息:

ConnectivityManager.ACTION_BACKGROUND_DATA_SETTING_CHANGED 
也许您正在发送数据之前检查cm.getBackgroundDataSetting(),我想这就足够了。但是,当设置更改时,收听广播消息将允许您恢复发送背景数据


我相信在发送数据之前,收听广播信息或检查设置就足够了。推荐前者。

除了您的检查之外,我还检查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移动网络上下载数据。

与@inazaruk一样,我也试图在仅使用GPRS漫游或下载图像时防止网络传输(对于用户来说可能很昂贵)。因此,在中,我实现了一个NetworkHelper,它检查用户对roming和最小网络状态的偏好;
匹配的首选项在这里:

我有一个扩展了
BroadcastReceiver
的类来执行下载。然后,我使用
AlarmManager
设置警报,以触发后台下载。每次触发接收器时,它都会在我的帖子中执行检查。我想我也可以听听你建议的广播信息,这样,如果背景更新已经关闭并且刚刚打开,我就可以立即触发下载。或者我可以等待下一次预定的下载。我想我得做个设计决定。。。谢谢你的帖子。有趣的方法,谢谢你的帖子。不会
!m_telephonyManager.isNetworkRoaming()
即使用户勾选了允许数据漫游的复选框,也会阻止下载?如果您没有在“设置”中勾选“数据漫游”,则漫游时没有人能够使用移动网络。但在我的情况下,即使启用了漫游,我也需要防止大量的网络使用(对于“轻度”请求,我没有进行漫游检查)。所以,是的,这将禁用应用程序的网络活动,即使启用了设备漫游。好问题。网络信息也没有isRoaming方法。(您是否只在北美地区开发应用程序,如果不是,这可能是个问题,因为网络协议可能不同。)是的,有一个
isRoaming()
方法。我还没有使用过它,因为
networkInfo.isAvailable()
如果网络正在漫游且用户已禁用数据漫游,则返回
false
。该应用程序将只在英国使用-我不认为这对我目前的代码有影响,但如果我要在答案中执行一些检查,我必须检查不同的网络类型。我很好奇。我浏览了源代码和文档。IsNetworkAvailable和其他任何产品一样可靠,因为它会检查您是否在家庭网络中。(毕竟,如果失败了,你的应用程序并不是唯一一个遇到麻烦的;)