跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Javajava

Android 网络连接状态判断与监控实战

Android 应用开发中需实时感知网络变化以优化用户体验。核心通过 ConnectivityManager 获取网络状态,结合 BroadcastReceiver 监听连接动作。实现步骤包括配置权限、编写工具类判断 WiFi 或移动数据连通性,并在 Activity 生命周期内注册取消广播接收器。注意高版本系统 API 变更及后台保活策略,避免内存泄漏。

随缘发布于 2025/1/17更新于 2026/10/25103 浏览
Android 网络连接状态判断与监控实战

在 Android 开发中,实时感知网络状态对于提升用户体验至关重要。以下方案基于 ConnectivityManager 实现网络可用性的判断与状态监听。

权限配置

首先需在清单文件中添加网络状态访问权限:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

核心工具方法

为了复用逻辑,建议封装静态工具类。以下是常用的判断方法:

1. 通用网络检查

判断当前设备是否有任何网络连接。

public boolean isNetworkConnected(Context context) {
    if (context == null) return false;
    ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo info = cm.getActiveNetworkInfo();
    return info != null && info.isAvailable();
}

2. 特定网络类型检查

区分 WiFi 和移动数据状态。

public boolean isWifiConnected(Context context) {
    ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo wifiInfo = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
    return wifiInfo != null && wifiInfo.isAvailable();
}

public boolean isMobileConnected(Context context) {
    ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo mobileInfo = cm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
    return mobileInfo != null && mobileInfo.isAvailable();
}

3. 获取网络类型

返回当前连接的具体类型标识。

public static int getConnectedType(Context context) {
    if (context == null) return -1;
    ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo info = cm.getActiveNetworkInfo();
    if (info != null && info.isAvailable()) {
        return info.getType();
    }
    return -1;
}

网络状态监听

当网络断开或重连时,应用需要做出响应。推荐使用 BroadcastReceiver。

注册与注销

在 Activity 或 Service 中管理生命周期。

// 定义接收器
BroadcastReceiver networkReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo mobNet = cm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
        NetworkInfo wifiNet = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
        
        if (!mobNet.isConnected() && !wifiNet.isConnected()) {
            Log.i("TAG", "网络已断开");
        } else {
            Log.i("TAG", "网络已连接");
        }
    }
};

// 注册
IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
registerReceiver(networkReceiver, filter);

// 注销 (建议在 onDestroy 中调用)
unregisterReceiver(networkReceiver);

注意事项

  1. API 兼容性:TYPE_WIFI 和 TYPE_MOBILE 在新版 Android 中已被标记为废弃,但在兼容旧版本时仍广泛使用。生产环境建议查阅官方文档确认最新 API。
  2. TelephonyManager 对比:虽然可以通过 TelephonyManager 监听数据连接状态,但实测发现回调频繁且状态有时不准确,容易收到重复信号。相比之下,ConnectivityManager 更加稳定可靠。
  3. 后台运行:若需在后台监听,建议配合 Service 使用,并务必注意内存泄漏问题,及时取消注册。
  4. 特殊场景:测试中发现关闭路由后程序可能未立即捕获断开信号,这通常是因为设备自动切换到了其他可用网络(如从 WiFi 切到 4G),属于正常现象。

目录

  1. 权限配置
  2. 核心工具方法
  3. 1. 通用网络检查
  4. 2. 特定网络类型检查
  5. 3. 获取网络类型
  6. 网络状态监听
  7. 注册与注销
  8. 注意事项

更多推荐文章

查看全部
  • ROS2 中的 TF 系统:机器人坐标系管理指南
  • C++11 详解右值引用与移动语义:从性能瓶颈到零拷贝优化
  • 基于 TRAE CN 与 MasterGo MCP 实现设计稿转前端代码实战
  • 前端 TypeScript 高级技巧:提升代码安全与质量
  • ClawdBot (OpenClaw) Discord 机器人部署指南
  • 大模型提示工程:掌握提问驱动 AI
  • 基于 AnythingtoRealCharacters2511 的 ACG 真人化素材自动化方案
  • 24 家大模型法律条款解释能力与合规性对比分析
  • 基于 LLaMA-Factory 的 Docker 环境模型训练与推理指南
  • Git 远程协作指南:从安装到代码提交常见问题解答
  • Pencil.dev:AI 驱动设计工具安装与实战教程
  • AI 幻觉深度解析:成因、风险与应对策略
  • Windows 平台部署 ZeroClaw 本地 AI 机器人实战
  • Trae 集成 Vizro:低代码构建数据可视化仪表板
  • AIGC 技术在元宇宙与虚拟世界中的应用实践
  • 无需公网 IP 实现 PostgreSQL 远程访问
  • 算法设计与分析:贪心算法
  • 腾讯 Claw 三剑客横评:WorkBuddy、QClaw、CodeBuddy AI Agent 选型指南
  • 使用 NVM 安装 Node.js 22 并配置国内镜像加速
  • 前端模块化开发:从面条代码到结构化代码的蜕变

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online