zoukankan      html  css  js  c++  java
  • Windows Phone 8 获取与监听网络连接状态

    现在的只能手机对网络的依赖程度都很高,尤其是新闻、微博、音乐、视频、VOIP通话、游戏等 事实性高的信息类应用,但是目前国内的信息费仍然高居不下,更多的用户只有在 WIFI 的环境下才愿意进行大数据量的流量从而节约流量费用。然而为了使我们的应用更加贴心、更加人性化,如何让我们的应用为用户省钱呢?今天为大家介绍下如何在 Windows Phone8 中获取和监听网络连接状态。

    首先在Windows Phone中可以使用 Microsoft.Phone.Net.NetworkInformation.NetworkInterface.NetworkInterfaceType 来获取应用的网络连接状态。

    public static string GetNetStates() 
    { 
        var info = Microsoft.Phone.Net.NetworkInformation.NetworkInterface.NetworkInterfaceType;
    
        switch (info) 
        { 
            case NetworkInterfaceType.MobileBroadbandCdma: 
                return "CDMA"; 
            case NetworkInterfaceType.MobileBroadbandGsm: 
                return "CSM"; 
            case NetworkInterfaceType.Wireless80211: 
                return "WiFi"; 
            case NetworkInterfaceType.Ethernet: 
                return "Ethernet"; 
            case NetworkInterfaceType.None: 
                return "None"; 
            default: 
                return "Other"; 
        } 
        //return null; 
    }

    通过以上代码肯定有同学觉得不够,因为不能看到当前的连接究竟是一个 2G 3G 甚至是4G的连接,WIFI 连接的是什么状态。

    这时候我们可以通过 DeviceNetworkInformation.ResolveHostNameAsync 来访问一个连接获取更多信息。

    image

    image

    public void GetNetName() 
    { 
        DeviceNetworkInformation.ResolveHostNameAsync( 
            new DnsEndPoint("www.microsoft.com", 80), 
            new NameResolutionCallback(handle => 
            { 
                NetworkInterfaceInfo info = handle.NetworkInterface; 
                if (info != null) 
                { 
                    Name = info.InterfaceName + " " + info.Description + " ";
    
                    switch (info.InterfaceType) 
                    { 
                        case NetworkInterfaceType.Ethernet: 
                            NetName = "Ethernet"; 
                            break; 
                        case NetworkInterfaceType.MobileBroadbandCdma: 
                        case NetworkInterfaceType.MobileBroadbandGsm: 
                            switch (info.InterfaceSubtype) 
                            { 
                                case NetworkInterfaceSubType.Cellular_3G: 
                                    NetName = "Cellular_3G + 3G"; 
                                    break; 
                                case NetworkInterfaceSubType.Cellular_EVDO: 
                                    NetName = "Cellular_EVDO + 3G"; 
                                    break; 
                                case NetworkInterfaceSubType.Cellular_EVDV: 
                                    NetName = "Cellular_EVDV + 3G"; 
                                    break; 
                                case NetworkInterfaceSubType.Cellular_HSPA: 
                                    NetName = "Cellular_HSPA + 3G"; 
                                    break; 
                                case NetworkInterfaceSubType.Cellular_GPRS: 
                                    NetName = "Cellular_GPRS + 2G"; 
                                    break; 
                                case NetworkInterfaceSubType.Cellular_EDGE: 
                                    NetName = "Cellular_EDGE + 2G"; 
                                    break; 
                                case NetworkInterfaceSubType.Cellular_1XRTT: 
                                    NetName = "Cellular_1XRTT + 2G"; 
                                    break; 
                                default: 
                                    NetName = "None"; 
                                    break; 
                            } 
                            break; 
                        case NetworkInterfaceType.Wireless80211: 
                            NetName = "WiFi"; 
                            break; 
                        default: 
                            NetName = "None"; 
                            break; 
                    } 
                } 
                else 
                    NetName = "None";
    
                Deployment.Current.Dispatcher.BeginInvoke(delegate() { MessageBox.Show(Name + NetName); }); 
                //MessageBox.Show(NetName);
    
            }), null); 
    }

    image

    相信以上信息 相信已经有很多朋友再应用中已经使用了 我在这里给大家总结一下,其次还有一个场景就是在网络条件发生变化的时候,比在从室内走到室外, WIFI 条件下自动切换到蜂窝网连接。

    这里在我们的模拟器中也可以模拟这个场景 VS- tools – simulation dashboard.

    image

    其次我们要在 APP 的 Launching 的事件中注册监听NetworkInformation.NetworkStatusChanged 事件激发这个事件的条件分别是:

    1. 当手机和 Wi-Fi 之间的连接类型改变时。
    2. 当用户进入或离开漫游状态时。
    3. 当 ApproachingDataLimit 或 OverDataLimit 变为 true 时。
    // Code to execute when the application is launching (eg, from Start) 
    // This code will not execute when the application is reactivated 
    private void Application_Launching(object sender, LaunchingEventArgs e) 
    { 
        NetworkInformation.NetworkStatusChanged += (object sener) => 
        { 
            Deployment.Current.Dispatcher.BeginInvoke(delegate() { MessageBox.Show("NetworkStatusChanged"); }); 
        }; 
    }

    image

    另外我们可以在 NetworkStatusChanged  之后获取 NetworkInformation 类的静态 GetInternetConnectionProfile方法

    NetworkCostType CostType = NetworkInformation.GetInternetConnectionProfile().GetConnectionCost().NetworkCostType;

    image

    image

    可以依据下表数据连接状态对应用进行优化处理。

    image

    欢迎大家在这里和我沟通交流或者在新浪微博上 @王博_Nick

  • 相关阅读:
    POJ 3672 水题......
    POJ 3279 枚举?
    STL
    241. Different Ways to Add Parentheses
    282. Expression Add Operators
    169. Majority Element
    Weekly Contest 121
    927. Three Equal Parts
    910. Smallest Range II
    921. Minimum Add to Make Parentheses Valid
  • 原文地址:https://www.cnblogs.com/sonic1abc/p/2995196.html
Copyright © 2011-2022 走看看