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

Android: 网络随时需要在3G和Wifi切换,网络程序需要注意的更多相关文章

  1. android 获取网络类型名称2G 3G 4G wifi

    首先工程Manifest文件要引用: <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" ...

  2. Android网络类型判断(2g、3g、wifi)

    判断网络类型是wifi,还是3G,还是2G网络,对不同 的网络进行不同的处理,现将判断方法整理给大家,以供参考   说明:下面用到的数据移动2G,联通2G,联通3G,wifi我都已经测试过,暂时手上 ...

  3. 转:Android 判断用户2G/3G/4G移动数据网络

    Android 判断用户2G/3G/4G移动数据网络 在做 Android App 的时候,为了给用户省流量,为了不激起用户的愤怒,为了更好的用户体验,是需要根据用户当前网络情况来做一些调整的,也可以 ...

  4. Android 判断用户2G/3G/4G移动数据网络

    Android 判断用户2G/3G/4G移动数据网络 在做 Android App 的时候,为了给用户省流量,为了不激起用户的愤怒,为了更好的用户体验,是需要根据用户当前网络情况来做一些调整的,也可以 ...

  5. 判断是否联网_检测网络的类型为3G、2G、wap、wifi

    判断是否联网_检测网络的类型为3G.2G.wap.wifi  判断是否联网: /*** * judge Internet is available * * @author wei-spring * @ ...

  6. Android判断用户的网络类型(2/3/4G、wifi)

    很多时候需要先判断当前用户的网络,才会继续之后的一些处理逻辑.但网络类型获取这一块,我用我自己的的手机调试时遇到一些问题,这里记录一下. 一加手机一代,移动4G 网络,得到的subtype类型值为17 ...

  7. 九、Android学习第八天——广播机制与WIFI网络操作(转)

    (转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 九.Android学习第八天——广播机制与WIFI网络操作 今天熟悉了An ...

  8. Swift - 判端网络连接状态,连接类型(3G还是Wifi)

    IJReachability是一个使用Swift写的第三方网络检测类.可以测试网络是否连接,并支持3G和Wifi的检测. 使用样例: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ...

  9. 蜂窝移动网络是什么,它和 Wi-Fi 有什么区别? 蓝牙和无线有什么区别?

    蜂窝移动网络是什么,它和 Wi-Fi 有什么区别? 转自知乎用户的一个回答: 原题问的是"数据流量是什么",不知道怎么又被改成"蜂窝移动网络是什么"了.说下个人 ...

随机推荐

  1. linux-文件数据操作awk命令

    最后一列是:交互外壳 单引号里的内容不会被bash扩展 cut 同样可以做到 "\t" 制表符 cut 和 sed 结合同样可以实现 扩展:匿名方法可以有多个,and方法只能有一个 ...

  2. 《Linux内核分析》第七周: 可执行程序的装载

    LINUX内核分析第七周学习总结--可执行程序的装载 杨舒雯(原创作品转载请注明出处) <Linux内核分析>MOOC课程http://mooc.study.163.com/course/ ...

  3. leetcode: 638.大礼包

    题目描述: https://leetcode-cn.com/problems/shopping-offers/ 解题思路: 这类求最大最小的问题首先想到的就是用DP求解. 这题还用到了递归,首先计算单 ...

  4. Spring及Spring Boot 国内快速开发框架

    http://www.javacoder.top/home.jsp# http://springboot.fun/ 一个常用的支付子项目 https://gitee.com/52itstyle/spr ...

  5. VC6到VC2010,项目迁移错误

    错误信息: error C2440: “static_cast”: cannot from “BOOL (__thiscall CSelectRect::* )(void)” to “BOOL (__ ...

  6. [转帖]浅析java程序的执行过程

    浅析java程序的执行过程 转帖来源: https://www.cnblogs.com/wangjiming/p/10315983.html 之前学习过 这一块东西 但是感觉理解的不深刻. copy一 ...

  7. 文件系统的block 数据库中的block 以及内存中的page基础知识汇总(自己理解 可能有误)

    1. 操作系统文件系统中的的block 文件系统中的block 是文件系统最小的读写单元,在HDD的磁盘时代, 一般block的大小可能与磁盘的扇区大小一致为 512bytes 也因为这个原因MBR启 ...

  8. CentOS7.5下MYSQL8.0.11

    MYsql的安装 1. 下载bundles 包 https://cdn.mysql.com//Downloads/MySQL-8.0/mysql-8.0.11-1.el7.x86_64.rpm-bun ...

  9. Jquery ajax $getScript()和$getJSON和JSONP

  10. U9财务体系