实用指南:[Harmony]网络状态监听

权限

module.json5中添加必要权限:

// 声明应用需要请求的权限列表"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"    }  }],
{  "name": "network_info_reason",  "value": "需要网络信息权限用于监听网络的变化"},{  "name": "internet_reason",  "value": "需要网络权限用来网络请求"},

监听工具

/** * 网络状态监听工具类 * 功能:实时监测网络连接状态及类型变化 */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 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();

示例

// 窗口舞台创建回调  onWindowStageCreate(windowStage: window.WindowStage): void {    ...networkMonitor.startMonitoring()  }

posted on 2025-10-08 13:54  slgkaifa  阅读(2)  评论(0)    收藏  举报

导航