博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android: 网络随时需要在3G和Wifi切换,网络程序需要注意
阅读量:4588 次
发布时间:2019-06-09

本文共 3664 字,大约阅读时间需要 12 分钟。

平时,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

 

转载于:https://www.cnblogs.com/personnel/p/4583135.html

你可能感兴趣的文章
.Net持续集成 —— Jenkins+Git+WebDeploy
查看>>
01_Numpy基本使用
查看>>
checkbox和文字对齐
查看>>
JConsole远程连接配置 服务器监控工具
查看>>
了解HTTP协议栈(实践篇)
查看>>
loj10035. 「一本通 2.1 练习 1」Power Strings
查看>>
%s的用法
查看>>
调用底层不能直接访问的类和方法
查看>>
清理缓存的方法 #DF
查看>>
JAVA array,map 转 json 字符串
查看>>
2017-12-27练习
查看>>
NET设计规范(二) 命名规范
查看>>
VMware 9.0.1安装Mac OS X Mountain Lion 10.8.2
查看>>
SSL延迟
查看>>
android新手关于左右滑动的问题,布局把<android.support.v4.view.ViewPager/><ImageView/> 放在上面就不行了。...
查看>>
深入理解DIP、IoC、DI以及IoC容器
查看>>
赋值文件
查看>>
Vue 数组 字典 template v-for 的使用
查看>>
蓝牙模块选择经验谈
查看>>
java中==和equals
查看>>