在<Windows Phone 7 - 取得Device相關資訊>介紹了DeviceStatus API之後,接下來往下介紹有關Device網路狀況的擷取。
為何要了解這個資訊呢,因為撰寫App當需要與Server或Remote Resouce互動時,一開始就先識別目前Device的網路狀態,
有助於節省呼叫了服務或進行了下載才在那等20秒HTTP RESPONSE;或者為App註冊一個監控網路狀態變動的Event Handler,
在網路變動時告知目前用戶的操作情境…等範例,這些都是常見於App或過去WinForm程式之中。
然而,在Windows Phone 7裡針對Device網路狀態(可用或使用中)可以透過<Microsoft.Phone.Net.NetworkInformation>命名空間
來加以處理,以下將針對裡面重要的類別加以說明:
〉DeviceNetworkInformation:
該類別包括了Windows Phone設備特定的網路資訊,也就是可取得特定的網路類型,例如:行動網路(Cellular)、無線網路(WIFI)。
除此之外,透過該類別的屬性與方法可以取目前可用/使用網路的類型、主機名稱、IP Address等,還可以註冊事件來監控網路狀態的
改變,其中幾個重要的屬性與方法,如下說明:
a. 重點屬性:(這些屬性都是Ready-Only)
a-1. CellularMobileOperator:取得行動網路營運商的名稱。
a-2. IsCellularDataEnabled:取得是否正啟動Cellular Data(行動網路)。
a-3. IsCellularDataRoamingEnabled:取得是否允許Cellular Data Roaming(數據漫遊)。
a-4. IsNetworkAvailable:取得是否有網路功能可用。
a-5. IsWiFiEnabled:取得是否正啟動WiFi網路。
b. NetworkAvailabilityChanged:
註冊處理當網路狀態改變時觸發的事件。例如註冊處理網路狀態由Cellular Data轉成WiFi時使用訊息通知。
該事件註冊後要處理的參數有二個,一個是object,一個是NetworkNotificationEventArgs,其中以NetworkNotificationEventArgs
最為重要,因為該參數夾帶了二個重要的資訊:NetworkInterfaceInfo、NetworkNotificationType。
b-1. NetworkInterfaceInfo:取得目前設備網路介面的所有可用資訊。例如:Bandwidth(網路的速度)、NetworkCharacteristics、
InterfaceName、InterfaceState(網路狀態)、InterfaceType(介面類型)…等。
b-2. NetworkNotificationType:取得目前網路介面狀態的變更類型。其變更類型分成三種:
‧InterfaceConnected:通知網路介面已為連線狀態。
‧InterfaceDisconnected:通知網路介面已為斷線狀態。
‧CharacteristicUpdate:當網路介面變動時發出通知,例如轉入漫遊。
c. 範例程式:實作註冊監控網路狀態的變動事件與識別變動後的網路狀態。
1: // Constructor
2: public MainPage()
3: {
4: InitializeComponent();
5: Initialization(false);
6: }
7:
8: private void Initialization(bool pIsRegist)
9: {
10: //識別是否啟動行動網路
11: tgsIcde.IsChecked = DeviceNetworkInformation.IsCellularDataEnabled;
12: //識別是否啟動數據漫游
13: tgsIcdr.IsChecked = DeviceNetworkInformation.IsCellularDataRoamingEnabled;
14: //識別設備網路是否有網路功能
15: tgsIna.IsChecked = DeviceNetworkInformation.IsNetworkAvailable;
16: //識別是否啟動WiFi
17: tgsIwifi.IsChecked = DeviceNetworkInformation.IsWiFiEnabled;
18:
19: //避免測試狀態為airplane mode
20: if (DeviceNetworkInformation.CellularMobileOperator!= null)
21: {
22: //識別CellularMobileOperator的類型
23: switch (DeviceNetworkInformation.CellularMobileOperator.ToLower())
24: {
25: case "chunghwa":
26: tblCellularOperator.Text = "中華";
27: break;
28: case "taiwanmobile":
29: tblCellularOperator.Text = "台哥大";
30: break;
31: case "fetnet":
32: tblCellularOperator.Text = "遠傳";
33: break;
34: }
35: }
36:
37: if (pIsRegist == false)
38: {
39: //註冊監控網路狀態
40: DeviceNetworkInformation.NetworkAvailabilityChanged +=
41: new EventHandler<NetworkNotificationEventArgs>(NetworkAvailabilityChanged);
42: }
43: }
44:
45: void NetworkAvailabilityChanged(object sender, NetworkNotificationEventArgs e)
46: {
47: //取得info來識別目前網路資訊
48: NetworkInterfaceInfo tInfo = e.NetworkInterface;
49:
50: //取得網路狀態通知類型
51: NetworkNotificationType tNotification = e.NotificationType;
52: string tType = string.Empty;
53: switch (tNotification)
54: {
55: case NetworkNotificationType.CharacteristicUpdate:
56: tType += "CharacteristicUpdate \n";
57: break;
58: case NetworkNotificationType.InterfaceConnected:
59: tType += "InterfaceConnected \n";
60: break;
61: case NetworkNotificationType.InterfaceDisconnected:
62: tType += "InterfaceDisconnected \n";
63: break;
64: }
65: Dispatcher.BeginInvoke(() =>
66: {
67: tblNetworkState.Text = tType;
68: Initialization(true);
69: });
70: }
71:
72: private void ApplicationBarIconButton_Click(object sender, EventArgs e)
73: {
74: //利用ConnectionSettingsTask修改網路狀態來測試監控網路狀態事件
75: ConnectionSettingsTask tConnectionSettings = new ConnectionSettingsTask();
76: tConnectionSettings.ConnectionSettingsType = ConnectionSettingsType.AirplaneMode;
77: tConnectionSettings.Show();
78: }
執行結果:
(變更前) (變更後)