问题 如何尊重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>

这一切似乎都很好,但我想知道我是否应该检查其他什么?我担心检查数据漫游但是 文档 说明 networkInfo.isAvailable() 检查这个给我。那么我需要为网络设置实施任何其他检查吗?我应该注意这个领域还有什么吗?


4720
2018-01-08 15:39


起源

好问题。网络信息是否也没有isRoaming方法。 (你是否只开发应用程序到北美地区,如果不是这可能是一个问题,因为网络协议可能不同)。 - uncaught_exceptions
是的,有一个 isRoaming() 方法。到目前为止我还没用过它 networkInfo.isAvailable() 似乎回来了 false 如果网络正在漫游且用户已禁用数据漫游。该应用程序将仅限英国 - 我没有 认为 这对我到目前为止的代码有影响,但是如果我要在答案中实现一些检查,我将不得不检查一个不同的NETWORK_TYPE。 - dave.c
我很好奇。我浏览了源代码和文档。 isNetworkAvilable是可靠的,因为它检查你是否在家庭网络。 (毕竟如果它失败了,你的申请不是唯一有麻烦的人;)) - uncaught_exceptions


答案:


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

ConnectivityManager.ACTION_BACKGROUND_DATA_SETTING_CHANGED 

也许你在发送数据之前检查cm.getBackgroundDataSetting(),我怀疑这就足够了。但是,收听广播消息将允许您在更改设置时继续发送背景数据。

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


6
2018-01-24 06:09



我有一个课程延伸 BroadcastReceiver 执行下载。然后我用它设置闹钟 AlarmManager 触发后台下载。每次触发接收器时,它都会在我的帖子中执行检查。我想我也可以收听你建议的广播消息,这样如果后台更新已经关闭并且刚刚重新打开,我可以立即触发下载。或者我可以等待下一次安排下载。我想我必须做出一个设计决定...感谢帖子。 - dave.c


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


6
2018-01-25 23:57



有趣的方法,谢谢你的帖子。岂不 !m_telephonyManager.isNetworkRoaming() 即使用户勾选了允许数据漫游的方框,也会阻止下载? - dave.c
如果您没有在设置中勾选“数据漫游”,则在漫游时没有人可以使用移动网络。但在我的情况下,即使启用了漫游,我也需要防止大量网络使用(对于“轻量级”请求,我没有进行漫游检查)。所以,是的,即使启用了设备漫游,这也会禁用应用程序的网络活动。 - inazaruk


像@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


2
2018-01-27 06:43