Android 网络掉线/上线广播监听

这是老版Android API(Android 7及更早)的实现方式,用广播接收器 + ConnectivityManager + NetworkInfo 来区分网络上线/掉线。

1. 核心知识点

  1. ConnectivityManager:系统服务类,专门管理网络连接状态。
  2. 权限:需要在 AndroidManifest.xml 添加网络状态权限
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
Code language: HTML, XML (xml)
  1. 原理:网络发生变化时,系统发送网络广播,在BroadcastReceiveronReceive回调里面,通过ConnectivityManager获取当前网络信息,判断是上线还是掉线。

2. 完整 onReceive 代码

public void onReceive(Context context, Intent intent) {
    // 获取网络管理系统服务
    ConnectivityManager connectivityManager =
            (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    // 获取当前活跃网络信息(过时API)
    NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();

    if (networkInfo != null) {
        if (networkInfo.isAvailable()) {
            Toast.makeText(context, "网络上线", Toast.LENGTH_LONG).show();
        } else {
            Toast.makeText(context, "网络掉线", Toast.LENGTH_LONG).show();
        }
    } else {
        // networkInfo为null,代表无网络
        Toast.makeText(context, "网络掉线", Toast.LENGTH_LONG).show();
    }
}
Code language: JavaScript (javascript)

3. 重要提醒(过时问题)

getActiveNetworkInfo()NetworkInfo 在 Android 10(API29)已经废弃

高版本Android推荐使用:ConnectivityManager.NetworkCallback 回调方式监听网络,不再推荐老广播 + NetworkInfo写法。

老方式的缺点

  1. Android 8.0(API26)之后,静态注册的网络状态广播被限制,静态注册无法收到网络变化广播,只能动态注册接收器。
  2. NetworkInfo 类废弃,高版本直接调用会警告甚至失效。

4. 动态注册广播接收器

// 定义广播接收器
public class NetReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        // 上面那段网络判断代码写在这里
    }
}

// 在Activity里动态注册
IntentFilter filter = new IntentFilter();
filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
NetReceiver receiver = new NetReceiver();
registerReceiver(receiver, filter);
Code language: PHP (php)

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注