目录
App都需要监听 Android 设备的网络连接状态,典型的例子就是在下载大文件前,需要判断当前是否正在使用 WIFI 网络,若是则下载;如果使用移动网络,则需要弹框提醒用户可能会消耗流量并扣费。
要监听网络状态,也需要考虑 Android 版本差异。
1.Android 5.0 以下版本
对于5.0以下版本,可以使用基类 activity 中注册网络状态接受者的方式来监听网络状态变化,这样所有继承基类的 activity 都可以监听网络状态变化。
2. Android 5.0 及以上版本
让我们看下Android 5.0行为变更—多个网络连接中的描述:
多个网络连接
Android 5.0 提供了新的多网络 API,允许您的应用动态扫描具有特定能力的可用网络,并与它们建立连接。当您的应用需要 SUPL、彩信或运营商计费网络等专业化网络时,或者您想使用特定类型的传输协议发送数据时,就可以使用此功能。
要从您的应用以动态方式选择并连接网络,请执行以下步骤:
- 创建一个
ConnectivityManager
。- 使用
NetworkRequest.Builder
类创建一个NetworkRequest
对象,并指定您的应用感兴趣的网络功能和传输类型。- 要扫描合适的网络,请调用
requestNetwork()
或registerNetworkCallback()
,并传入NetworkRequest
对象和ConnectivityManager.NetworkCallback
的实现。如果您想在检测到合适的网络时主动切换到该网络,请使用requestNetwork()
方法;如果只是接收已扫描网络的通知而不需要主动切换,请改用registerNetworkCallback()
方法。当系统检测到合适的网络时,它会连接到该网络并调用
onAvailable()
回调。您可以使用回调中的Network
对象来获取有关网络的更多信息,或者引导通信使用所选网络。
针对5.0及以上版本,google推荐我们使用上述方法来监听网络状态,至于使用 requestNetwork()
还是 registerNetworkCallback(),就看自己的需求了。
同时在5.0以下版本中使用的方法仍然可用。
3.Android 7.0 及以上版本
通过注册网络状态接收器,5.0 以上或以下的Android版本的网络状态我们都可以监听,但是面向 Android 7.0 开发的应用不会收到在清单文件中注册的 CONNECTIVITY_ACTION
广播,以下是 Android 7.0 行为变更—后台优化中的描述:
Project Svelte:后台优化
Android 7.0 移除了三项隐式广播,以帮助优化内存使用和电量消耗。此项变更很有必要,因为隐式广播会在后台频繁启动已注册侦听这些广播的应用。删除这些广播可以显著提升设备性能和用户体验。
移动设备会经历频繁的连接变更,例如在 WLAN 和移动数据之间切换时。目前,可以通过在应用清单中注册一个接收器来侦听隐式
CONNECTIVITY_ACTION
广播,让应用能够监控这些变更。由于很多应用会注册接收此广播,因此单次网络切换即会导致所有应用被唤醒并同时处理此广播。同理,在之前版本的 Android 中,应用可以注册接收来自其他应用(例如相机)的隐式
ACTION_NEW_PICTURE
和ACTION_NEW_VIDEO
广播。当用户使用相机应用拍摄照片时,这些应用即会被唤醒以处理广播。为缓解这些问题,Android 7.0 应用了以下优化措施:
- 面向 Android 7.0 开发的应用不会收到