[Harmony]网络状态监听

权限

module.json5中添加必要权限:

TypeScript 复制代码
// 声明应用需要请求的权限列表
"requestPermissions": [
  {
    "name": "ohos.permission.GET_NETWORK_INFO", // 网络信息权限
    "reason": "$string:network_info_reason",
    "usedScene": {
      "abilities": ['MFVoiceManager'],
      "when": "always"
    }
  },
  {
    "name": "ohos.permission.INTERNET", // 网络权限
    "reason": "$string:internet_reason",
    "usedScene": {
      "abilities": [],
      "when": "always"
    }
  }
],
TypeScript 复制代码
{
  "name": "network_info_reason",
  "value": "需要网络信息权限用于监听网络的变化"
},
{
  "name": "internet_reason",
  "value": "需要网络权限用来网络请求"
},

监听工具

TypeScript 复制代码
/**
 * 网络状态监听工具类
 * 功能:实时监测网络连接状态及类型变化
 */
import { connection } from '@kit.NetworkKit';
import { BusinessError } from '@kit.BasicServicesKit';
import ConsoleLog from '../extension/ConsoleLog';

// 网络类型定义
type NetworkType = 'NONE' | 'CELLULAR' | 'WIFI' | 'ETHERNET';

class NetworkMonitor {
  private static instance: NetworkMonitor;
  private netConnection?: connection.NetConnection;
  private listeners: Array<(status: NetworkType) => void> = [];

  // 单例获取
  static getInstance(): NetworkMonitor {
    if (!NetworkMonitor.instance) {
      NetworkMonitor.instance = new NetworkMonitor();
    }
    return NetworkMonitor.instance;
  }

  /**
   * 启动网络监听
   */
  startMonitoring(): void {
    try {
      this.netConnection = connection.createNetConnection();

      // 注册网络状态监听
      this.netConnection.register((err: BusinessError) => {
        if (err) {
          ConsoleLog.error(`网络状态监听注册失败: ${err.code}-${err.message}`);
        } else {
          ConsoleLog.log('网络状态监听注册成功');
        }
      });

      // 监听网络可用事件
      this.netConnection.on('netAvailable', (data: connection.NetHandle) => {
        ConsoleLog.log('网络已连接');
        this.checkNetworkType(data);
      });

      // 监听网络断开事件
      this.netConnection.on('netLost', () => {
        ConsoleLog.log('网络已断开 - 无互联网连接');
      });

      // 监听网络不可用事件
      this.netConnection.on('netUnavailable', () => {
        ConsoleLog.log('网络不可用');
      });
    } catch (error) {
      ConsoleLog.error(`NetworkMonitor Initialization error: ${error}`);
    }
  }

  // 检查当前网络类型
  checkNetworkType(netHandle: connection.NetHandle) {
    connection.getNetCapabilities(netHandle, (error: BusinessError, data: connection.NetCapabilities) => {
      if (error) {
        ConsoleLog.error('获取网络能力失败:', JSON.stringify(error));
        return;
      }

      if (data && data.bearerTypes) {
        const networkType = this.parseBearerType(data.bearerTypes[0]);
        ConsoleLog.log('当前网络类型:', networkType);
        this.triggerListeners(true, networkType); // 触发回调
      }
    });
  }

  /**
   * 解析网络承载类型
   * @param type 网络类型编码
   * @returns 标准化网络类型
   */
  private parseBearerType(type?: number): NetworkType {
    if (!type) return 'NONE';
    switch(type) {
      case connection.NetBearType.BEARER_CELLULAR: return 'CELLULAR'; // 蜂窝网络
      case connection.NetBearType.BEARER_WIFI: return 'WIFI'; // Wi-Fi
      case connection.NetBearType.BEARER_ETHERNET: return 'ETHERNET'; // 以太网
      default: return 'NONE'; // 未知网络
    }
  }

  /**
   * 注册状态监听
   * @param callback 状态变更回调函数
   */
  addListener(callback: (status: NetworkType) => void): void {
    this.listeners.push(callback);
  }

  /**
   * 移除状态监听
   * @param callback 要移除的回调函数
   */
  removeListener(callback: Function): void {
    this.listeners = this.listeners.filter(cb => cb !== callback);
  }

  // 在事件处理方法中触发回调(例如netAvailable事件)
  private triggerListeners(isConnected: boolean, type: NetworkType) {
    this.listeners.forEach(cb => cb(type));
  }
}

export const networkMonitor = NetworkMonitor.getInstance();

示例

TypeScript 复制代码
  // 窗口舞台创建回调
  onWindowStageCreate(windowStage: window.WindowStage): void {
    ...
networkMonitor.startMonitoring()
  }
相关推荐
ai安歌1 小时前
鸿蒙PC:鸿蒙electron跨端框架PC归档流水线实战:把散落文件整理成可追踪的桌面归档流程
华为·electron·harmonyos
lqj_本人2 小时前
鸿蒙electron跨端框架PC课业板实战:课程、截止时间、提交物和风险都放到桌面上
服务器·electron·harmonyos
小雨青年5 小时前
鸿蒙 HarmonyOS 6 | Pura X Max 鸿蒙原生适配 10:横屏下页面从上下结构改为左右结构
华为·harmonyos
lqj_本人5 小时前
鸿蒙electron跨端框架PC灵光速记实战:让突然冒出来的想法先有地方落脚
harmonyos
Swift社区6 小时前
HarmonyOS 鸿蒙PC三方库移植:vcpkg方式的 Port 脚本编写简明教程
华为·harmonyos
lqj_本人6 小时前
鸿蒙electron跨端框架PC剪贴台实战:把高频短文本整理成一键可取的桌面片段库
华为·electron·harmonyos
ai安歌7 小时前
鸿蒙PC:鸿蒙electron跨端框架PC素材情绪板实战:把灵感、配色和参考资料收进桌面创作面板
华为·electron·harmonyos
梦想不只是梦与想7 小时前
鸿蒙 Live View Kit:实况窗服务(一)
harmonyos·鸿蒙·实况窗
nashane7 小时前
HarmonyOS 6学习:Web组件内嵌H5视频全屏“复活”指南
前端·学习·harmonyos
lqj_本人8 小时前
鸿蒙electron跨端框架PC墨案写作实战:把 Markdown 正文区做成桌面写作的中心
华为·electron·harmonyos