# 12.7:网络状态监听

应用开发中会有监听网络状态的情形,比如刷短视频的时候,如果设备网络由 WiFi 切换为移动网络,这时候应该给用户友好提示比如注意流量消耗等。针对这种场景,ArkUI开放框架在 @ohos.telephony.observer 模块里添加了对网络状态监听的支持,本节笔者简单介绍一下相关 API 的使用。

# 12.7.1:限制与约束

  • DevEco Studio 的 预览器暂不支持网络请求,只能在模拟器或真机上进行。

  • 监听网络状态需要申请 ohos.permission.GET_NETWORK_INFO 权限。

# 12.7.2:监听网络状态

@ohos.telephony.observer 模块里定义的监听网络 API 如下所示:

declare namespace observer {
  // 监听网络状态
  function on(type: 'networkStateChange', callback: Callback<NetworkState>): void;
  // 监听制定卡槽的网络状态
  function on(type: 'networkStateChange', options: { slotId: number }, callback: Callback<NetworkState>): void;
  // 取消监听
  function off(type: 'networkStateChange', callback?: Callback<NetworkState>): void;
}
1
2
3
4
5
6
7
8
  • on:值为 networkStateChange ,订阅网络状态变化的事件。

  • off:值为 networkStateChange ,取消订阅网络变化的事件。

    📢:取消订阅如果传递参数为null,则清空所有订阅。

  • slotId:订阅指定卡槽位的网络状态变化事件。

  • callback:网络状态变化时的回到,NetworkState 参数说明如下:

    • longOperatorName:注册网络的长运营商名称。
    • shortOperatorName:注册网络的短运营商名称。
    • plmnNumeric:注册网络的 PLMN 码。
    • isRoaming:是否处于漫游状态。
    • regState:设备的网络注册状态。
    • nsaState:设备的NSA网络注册状态。
    • isCaActive:是否支持载波聚合(Carrier Aggregation)。
    • isEmergency:此设备是否只允许拨打紧急呼叫。

简单样例如下所示:

// 引入监听库
import observer from '@ohos.telephony.observer';

@Entry @Component struct NetworkTest {
  build() {
    Column({space: 10}) {
    }
    .width('100%')
    .height('100%')
    .padding(10)
  }

  private networkChanged(networkState) {
    console.log("network state: " + JSON.stringify(networkState))
  }

  // 页面显示的时候,订阅networkStateChange事件
  aboutToAppear() {
    observer.on('networkStateChange', this.networkChanged)
  }
  
  // 页面隐藏的时候,取消订阅networkStateChange事件
  aboutToDisappear() {
    observer.off('networkStateChange', this.networkChanged)
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

# 12.7.3:获取网络状态

除了使用 @ohos.telephony.observer 模块里的 API 以注入监听器的方式获取网络状态外,ArkUI开发框架还在 @ohos.telephony.radio 模块里添加了getNetworkState()方法直接获取当前的网络状态,源码如下所示:

declare namespace radio {
  // 获取网络状态
  function getNetworkState(callback: AsyncCallback<NetworkState>): void;
}
1
2
3
4

简单样例如下所示:

// 引入库
import observer from '@ohos.telephony.observer';
// 引入库
import radio from '@ohos.telephony.radio';

@Entry @Component struct NetworkTest {

  @State netState: string = "";

  build() {
    Column({space: 10}) {
      Button('获取网络状态')
        .onClick(() => {
          radio.getNetworkState((error, data) => {
            if(data) {
              this.netState = JSON.stringify(data);
            } else {
              this.netState = "net invalid";
            }
          })
        })

      Text(this.netState)
        .fontSize(20)
    }
    .width('100%')
    .height('100%')
    .padding(10)
  }

  private networkChanged(networkState) {
    console.log("network state: " + JSON.stringify(networkState))
  }

  aboutToAppear() {
    observer.on('networkStateChange', this.networkChanged)
  }

  aboutToDisappear() {
    observer.off('networkStateChange', this.networkChanged)
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42

样例运行结果如下图所示:

12_7_3_1

# 12.7.4:小结:

本节简单介绍了网络状态获取和监听的实现方式,@ohos.telephony.observer 模块和@ohos.telephony.radio 模块里还有许多其它重要的 API 读者可自行查看,比如获取电话状态,SIM 卡等信息。

(adsbygoogle = window.adsbygoogle || []).push({});
请作者喝杯咖啡

津公网安备 12011402001367号

津ICP备2020008934号-2

中央网信办互联网违法和不良信息举报中心

天津市互联网违法和不良信息举报中心