确定和监控连接状态

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

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

确定您是否连入了互联网

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

Kotlin

    val cm = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
    val activeNetwork: NetworkInfo? = cm.activeNetworkInfo
    val isConnected: Boolean = activeNetwork?.isConnectedOrConnecting == true
    

Java

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

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

确定您的互联网连接类型

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

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

Kotlin

    val isWiFi: Boolean = activeNetwork?.type == ConnectivityManager.TYPE_WIFI
    

Java

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

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

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

监控连接变化

如果以 Android 7.0(API 级别 24)及更高版本为目标平台的应用在其清单中声明广播接收器,它们不会收到 CONNECTIVITY_ACTION 广播。如果应用使用 Context.registerReceiver() 注册 BroadcastReceiver 且该上下文仍有效,它们会收到 CONNECTIVITY_ACTION 广播。