这是老版Android API(Android 7及更早)的实现方式,用广播接收器 +
ConnectivityManager+NetworkInfo来区分网络上线/掉线。
1. 核心知识点
- ConnectivityManager:系统服务类,专门管理网络连接状态。
- 权限:需要在
AndroidManifest.xml添加网络状态权限
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
Code language: HTML, XML (xml)
- 原理:网络发生变化时,系统发送网络广播,在
BroadcastReceiver的onReceive回调里面,通过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写法。
老方式的缺点
- Android 8.0(API26)之后,静态注册的网络状态广播被限制,静态注册无法收到网络变化广播,只能动态注册接收器。
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)
Previous: 一个例子-接收系统广播
Next: 静态注册的方式实现开机提示