监听 Android 设备网络状态的理想实践

本文介绍了在不同Android版本下监听网络状态的最佳实践。针对Android 5.0及以下,建议使用基类Activity注册网络状态接收器;5.0及以上版本,Google推荐使用ConnectivityManager的NetworkRequest和NetworkCallback。在Android 7.0及以上,静态注册的网络状态广播接收器将不再有效,需改为动态注册。文中提供了代码示例和注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1.Android 5.0 以下版本

2. Android 5.0 及以上版本

3.Android 7.0 及以上版本

4.代码实现


App都需要监听 Android 设备的网络连接状态,典型的例子就是在下载大文件前,需要判断当前是否正在使用 WIFI 网络,若是则下载;如果使用移动网络,则需要弹框提醒用户可能会消耗流量并扣费。

要监听网络状态,也需要考虑 Android 版本差异。

1.Android 5.0 以下版本

对于5.0以下版本,可以使用基类 activity 中注册网络状态接受者的方式来监听网络状态变化,这样所有继承基类的 activity 都可以监听网络状态变化。

2. Android 5.0 及以上版本

让我们看下Android 5.0行为变更—多个网络连接中的描述:

多个网络连接

Android 5.0 提供了新的多网络 API,允许您的应用动态扫描具有特定能力的可用网络,并与它们建立连接。当您的应用需要 SUPL、彩信或运营商计费网络等专业化网络时,或者您想使用特定类型的传输协议发送数据时,就可以使用此功能。

要从您的应用以动态方式选择并连接网络,请执行以下步骤:

  1. 创建一个 ConnectivityManager
  2. 使用 NetworkRequest.Builder 类创建一个 NetworkRequest 对象,并指定您的应用感兴趣的网络功能和传输类型。
  3. 要扫描合适的网络,请调用 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 开发的应用不会收到 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值