周期性通知(Alarm)和后台服务(Service)通常用来定期从互联网下载程序需要的数据或者执行长时间的下载操作。但是如果没有接入互联网,或者网络速度非常慢而无法及时完成下载操作,在这种情况下就不应该去更新数据了。
可以通过ConnectivityManager类来检查是否接入互联网了,如果接入还可以查询是用哪种上网方式。
检测是否接入因特网
如果没有接入互联网是没有必要去更新网络数据的。下面的示例代码演示了如何使用ConnectivityManager来查询当前活动的网络并且判断是否接入了互联网。
ConnectivityManager cm =
(ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
boolean isConnected = activeNetwork.isConnectedOrConnecting();
检测网络连接的类型
Android还可以检查当前联网的网络类型。
设备可以通过移动网络、WiMAX、Wi-Fi 以及以太网连接访问互联网。通过查询活动的网络连接,您可以根据不同的网络类型来更改数据更新频率,代码如下:
boolean isWiFi = activeNetwork.getType() == ConnectivityManager.TYPE_WIFI;
移动网络连接相比Wi-Fi来说会更加慢,所以大部分情况下,您的程序应该在移动网络下减少数据更新频率。同样的,应该只在Wi-Fi可用的情况下采才去下载比较大的文件。
如果您已经禁止了数据更新,还应该监测数据连接的改变当网络可用的时候来恢复数据连接。
监测联网状态的改变
当网络连接改变的时候,ConnectivityManager广播CONNECTIVITY_ACTION("android.net.conn.CONNECTIVITY_CHANGE") 事件。可以在Manifest文件中注册一个Receiver来接收该事件,并作出响应。
<action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
设备的网络连接状态可能会经常性的改变,当设备从移动网络变为Wi-Fi的时候该广播通知就会触发,反之亦然。所以,只有当您已经停止更新数据或者下载文件的时候才监测该事件以便恢复更新数据是一个比较好的做法。一般而言在更新数据之前先检查一下网络是否可用,如果不可用就等到网络可用的时候再更新数据。
这种方法需要切换Manifest文件中声明的Broadcast Receiver的状态,