设定周期性的闹铃提醒和后台服务,最常见的用途是定期更新应用程序的数据,从互联网上下载资源,缓存数据或者执行长时间的下载任务。但是如果设备当前没有连接到网络,或者是网络状况不稳定,连接太慢,不能正常完成数据的下载任务,那么此时仍需要唤醒设备来更新数据么?
您可以通过 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),那么暂停的任务就可以重新开始执行了。
监测网络连接的变化
一旦设备连接的网络环境发生变化,系统的 ConnectivityManager 会广播一个类型为 CONNECTIVITY_ACTION ("android.net.conn.CONNECTIVITY_CHANGE") 的通知消息,您可以在应用程序的 manifest 文件中定义相应的广播接收器receiver,然后根据网络环境的变化来适当调整程序数据的更新频率。
示例代码
<action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
网络环境的变化可能会非常频繁,只要设备的网络环境在无线网络和移动网络之间来回切换的时候,系统都会广播网络变化的通知,比较好的做法是,只有当您的更新程序此时处于暂停的状态,并且在网络连接上的时候需要恢复暂停工作的执行,那么应当注册和监听网络变化的广播,如果接收到广播通知,只需要检查网络是否已经连接上了,如果网络已经连接,那么应用程序就可以开始数据,否则的话,仍旧保持在暂停的状态,一直等到网络重新连接上了,再恢复任务的执行。
我们需要这样一种解决方法可以使您方便的注册和注销 manifest 中声明的广播接收器 Receivers, 在下一节课再继续讨论。
参考文摘:
https://developer.android.com/training/monitoring-device-state/connectivity-monitoring.html