安卓广播监听网络
- 行业动态
- 2025-04-23
- 3
通过BroadcastReceiver监听网络状态变化,动态或静态注册接收器,处理CONNECTIVITY_ACTION广播,获取NetworkInfo对象判断网络
传统广播监听方式(BroadcastReceiver)
核心原理
通过动态注册 BroadcastReceiver
监听系统网络状态变化的广播(android.net.conn.CONNECTIVITY_CHANGE
),在网络连接/断开时触发回调。
必要权限
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.INTERNET" /> <!-非必须,视需求而定 --> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <!-开机广播权限 -->
实现步骤
步骤 | 代码示例 | 说明 |
---|---|---|
创建 BroadcastReceiver 子类 | java<br>public class NetworkChangeReceiver extends BroadcastReceiver {<br> @Override<br> public void onReceive(Context context, Intent intent) {<br> // 处理网络变化逻辑<br> }<br>} |
定义接收网络广播的逻辑 |
动态注册接收器 | java<br>networkReceiver = new NetworkChangeReceiver();<br>IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);<br>registerReceiver(networkReceiver, filter); | 在 Activity/Service 中注册,需在 onDestroy() 中注销 |
|
监听开机广播(可选) | java<br>// 在 Manifest 中声明<br><receiver android:enabled="true" android:exported="false"><br> <intent-filter><br> <action android:name="android.intent.action.BOOT_COMPLETED" /><br></intent-filter></receiver> |
确保应用被杀死后仍能恢复监听 |
现代推荐方案(NetworkCallback)
优势对比
特性 | BroadcastReceiver | NetworkCallback |
---|---|---|
实时性 | 依赖系统广播频率(约2秒) | 即时回调 |
生命周期管理 | 需手动注册/注销 | 绑定 Lifecycle 自动管理 |
兼容性 | 需动态注册(Android 8+) | 支持所有 Android 版本 |
实现步骤(结合 Lifecycle)
// 1. 创建 NetworkCallback 实例 ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkRequest request = new NetworkRequest.Builder().build(); cm.registerNetworkCallback(request, new ConnectivityManager.NetworkCallback() { @Override public void onAvailable(Network network) { super.onAvailable(network); // 网络可用回调 } @Override public void onLost(Network network) { super.onLost(network); // 网络断开回调 } }); // 2. 绑定 Lifecycle(如在 Activity 中) LifecycleObserver lifecycleObserver = new LifecycleObserver() { @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY) public void onDestroy() { cm.unregisterNetworkCallback(networkCallback); // 自动注销 } }; getLifecycle().addObserver(lifecycleObserver);
关键差异对比表
维度 | BroadcastReceiver | NetworkCallback |
---|---|---|
注册方式 | 动态/静态(不推荐静态) | 代码主动注册 |
触发频率 | 系统广播间隔(约2秒) | 网络状态变化立即触发 |
生命周期绑定 | 需手动管理 | 可绑定组件生命周期 |
API 等级限制 | Android 8+ 需动态注册 | 全版本兼容 |
常见问题与解答
问题1:如何区分当前网络是 WiFi 还是移动数据?
解答:
通过 ConnectivityManager
获取当前网络信息:
NetworkInfo info = cm.getActiveNetworkInfo(); if (info != null) { if (info.getType() == ConnectivityManager.TYPE_WIFI) { // WiFi 网络 } else if (info.getType() == ConnectivityManager.TYPE_MOBILE) { // 移动数据网络 } }
问题2:如何在无网络时提示用户?
解答:
在 onLost()
或 onReceive()
回调中检查网络状态:
if (cm.getActiveNetworkInfo() == null) { // 显示无网络提示(Toast/Dialog) }