当前位置:首页 > 行业动态 > 正文

安卓广播监听网络

通过BroadcastReceiver监听网络状态变化,动态或静态注册接收器,处理CONNECTIVITY_ACTION广播,获取NetworkInfo对象判断网络

传统广播监听方式(BroadcastReceiver)

核心原理

通过动态注册 BroadcastReceiver 监听系统网络状态变化的广播(android.net.conn.CONNECTIVITY_CHANGE),在网络连接/断开时触发回调。

安卓广播监听网络  第1张

必要权限

<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 获取当前网络信息:

安卓广播监听网络  第2张

NetworkInfo info = cm.getActiveNetworkInfo();
if (info != null) {
    if (info.getType() == ConnectivityManager.TYPE_WIFI) {
        // WiFi 网络
    } else if (info.getType() == ConnectivityManager.TYPE_MOBILE) {
        // 移动数据网络
    }
}

问题2:如何在无网络时提示用户?

解答
onLost()onReceive() 回调中检查网络状态:

安卓广播监听网络  第3张

if (cm.getActiveNetworkInfo() == null) {
    // 显示无网络提示(Toast/Dialog)
}
0