确定和监控连接状态

重复闹铃和后台服务的一些最常见用途是安排定期从互联网资源、缓存数据更新应用数据,或者执行长时间下载。但如果您未连入互联网,或者因连接速度过慢而无法完成下载,何苦要唤醒设备来安排更新呢?

您可以利用 ConnectivityManager 来检查是否已实际连入互联网以及已连入情况下的连接类型。

确定您是否连入了互联网

如果您未连入互联网,则无需安排基于互联网资源的更新。 下面这段代码展示了如何利用 ConnectivityManager 查询活动网络并确定其是否连入了互联网。

ConnectivityManager cm =
        (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);

NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
boolean isConnected = activeNetwork != null &&
                      activeNetwork.isConnectedOrConnecting();

确定您的互联网连接类型

还可以确定当前可用的互联网连接类型。

设备连接可由移动数据、WiMAX、Wi-Fi 和以太网连接提供。如下所示,您可以通过查询活动网络的类型,根据可用带宽改变更新频率。

boolean isWiFi = activeNetwork.getType() == ConnectivityManager.TYPE_WIFI;

移动数据成本往往远高于 Wi-Fi,因此在大多数情况下,使用移动连接时应降低您的应用的更新频率。 同理,您应在接入 Wi-Fi 后再进行大数据量下载。

停用更新后,您必须侦听连接变化,以便在建立互联网连接后立即恢复更新。

监控连接变化

每当连接详情发生变化时,ConnectivityManager 便会广播 CONNECTIVITY_ACTION ("android.net.conn.CONNECTIVITY_CHANGE") 操作。您可以在清单文件中注册一个广播接收器,以便侦听这些变化和相应地恢复(或暂停)后台更新。

<action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>

设备的连接变化可能非常频繁—您每次在移动数据与 Wi-Fi 之间切换时都会触发该广播。 因此,最好只在您之前暂停过更新或下载时监控该广播,以便恢复这些更新或下载。通常,只要在开始更新前检查互联网连接即已足够,如果没有任何连接,则再暂停其他更新直至连接恢复。

此技巧需要切换您在清单文件中声明的广播接收器,这方面内容将在下一节课介绍。