实用指南:[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() }