zoukankan      html  css  js  c++  java
  • Android: 网络随时需要在3G和Wifi切换,网络程序需要注意

    平时,3G和WIFI 都开着的时候,Android默认使用Wifi,但现实环境中不可能到处都有wifi,所以手机会经常自动切换网络。

    有的时候,手机一开始使用wifi上网,当进入待机后10-30分钟,会自动从Wifi切换到3G网络。

    如果编写网络程序,网络自动切换对程序的影响是非常明显的,IP地址肯定会变化。

    感觉Android环境与我们日常用的windows环境还是有很大不同的,写Android程序,明显需要注意的细节有很多。

    ------------------------------------------------------------------------------------------------------------------------------------------------

    下面附上相关的一些代码:
    //listen 网络连接状态:  全部断开,当前正在使用Wifi网络,当前正在使用mobile网络,这个主要用于数据通讯时使用的线路判断

    UpdateReceiver  receiver = new UpdateReceiver();

    filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);

    registerReceiver(receiver, filter); //注册,开始接听广播

    //接收来自Service的广播消息
     class UpdateReceiver extends BroadcastReceiver
     {
      private int previousNetType = -1;

      @Override
      public void onReceive(Context context, Intent intent)
      {
       //System.out.println("接收到的广播信息:" + intent + "------" + intent.getExtras());

       String action = intent.getAction();

    if (action.equals(ConnectivityManager.CONNECTIVITY_ACTION))
       {
        //listen:网络状态已变化 -> 断网 or 移动网络上线 or wifi网络上线 or 移动网络与wifi切换  
        //通过 intent.getExtras() 能提到详细的网络变化参数信息

        //ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        //NetworkInfo mobileNetInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
        //NetworkInfo wifiNetInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);

        NetworkInfo networkInfo = (NetworkInfo) intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO); //当前的
        NetworkInfo otherNetworkInfo = (NetworkInfo) intent.getParcelableExtra(ConnectivityManager.EXTRA_OTHER_NETWORK_INFO); //另一个网络状态

        boolean hasNoConnected = intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false); //检查是否网络全部断开  
        boolean isFailover = intent.getBooleanExtra(ConnectivityManager.EXTRA_IS_FAILOVER, false); //是不是wifi 和 3g在切换 | 故障转移   
        //String reason = intent.getStringExtra(ConnectivityManager.EXTRA_REASON);  //原因,因什么而change

        if (hasNoConnected)
        {
         previousNetType = -1;

         isNetOnLine = false;

         if (currentFriend != null)
         {
          addSystemTipToTalk("网络已断开,你已离线.", currentFriend.getNumber());
         }

         //如果手机之前是通过wifi上网,同时关闭了3G数据网络,当进入锁屏后,可能是几分钟时间,android一般会自动关闭wifi连接,需要声音提示
         if (activityIsStoped || mKeyguardManager.inKeyguardRestrictedInputMode())
         {
          showNotify(A.ID_NOTIFY_GOING, getResources().getString(R.string.app_name), "网络已断开,你已离线.", "网络已断开,你已离线.", R.drawable.ic_stat_logo,
            Notification.FLAG_NO_CLEAR);
         }
         else
         {
          showSystemTip("网络已断开,你已离线.");
         }
        }
        else
        {
         isNetOnLine = true;

         if (isFailover || otherNetworkInfo == null)
         {
          if (networkInfo.getType() == ConnectivityManager.TYPE_WIFI)
          {
           if (previousNetType != ConnectivityManager.TYPE_WIFI && networkInfo.isConnected())
           {
            previousNetType = ConnectivityManager.TYPE_WIFI;

            if (currentFriend != null)
            {
             addSystemTipToTalk("WIFI网络已启用.", currentFriend.getNumber());
            }

            showSystemTip("WIFI网络已启用");

            //由于刚刚切换网络,不能马上发送数据,等几秒后再发,比较可靠
            new Thread(new Runnable() {
             public void run()
             {
              try
              {
               Thread.sleep(2000);
              }
              catch (InterruptedException e)
              {
              }
              sendBroadcast(XinTiaoService.INTENT_XINTIAO); //通知服务器,我切换了网络
             }
            }).start();

           }
          }
          else
          {
           if (previousNetType == ConnectivityManager.TYPE_WIFI || previousNetType == -1)
           {
            if (networkInfo.isConnected())
            {
             previousNetType = ConnectivityManager.TYPE_MOBILE;

             if (currentFriend != null)
             {
              addSystemTipToTalk(networkInfo.getSubtypeName() + "网络已启用.", currentFriend.getNumber());
             }

             showSystemTip(networkInfo.getSubtypeName() + "网络已启用");

             //由于刚刚切换网络,不能马上发送数据,等几秒后再发,比较可靠
             new Thread(new Runnable() {
              public void run()
              {
               try
               {
                Thread.sleep(2000);
               }
               catch (InterruptedException e)
               {
               }
               sendBroadcast(XinTiaoService.INTENT_XINTIAO); //通知服务器,我切换了网络
              }
             }).start();
            }
           }
          }
         }

    2011-11-27

  • 相关阅读:
    [转载自 文顶顶]iOS开发UI篇—程序启动原理和UIApplication
    中专生自学Android到找到工作的前前后后
    HashCode与IEqualityComparer接口
    abp vnext使用记录之微服务
    asp.net core 外部认证多站点模式实现
    xamarin.android 绑定百度地图SDK遇到的问题
    asp.net core 之多语言国际化自定义资源文件
    asp.net core tags 扩展之 id 和 name
    asp.net 后台任务作业框架收集
    向量
  • 原文地址:https://www.cnblogs.com/personnel/p/4583135.html
Copyright © 2011-2022 走看看