平时,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. jenkins中配置svn 出现absolute path is not allowed

    代码: 兵马未动,粮草先行 作者: 传说中的汽水枪 如有错误,请留言指正,欢迎一起探讨. 转载请注明出处. 想用jenkins作自动化部署tomcat. svn代码已经checkout到本地目录了(/ ...

  2. 如何用chrome查看post get及返回的数据

    chrome浏览器按下F12打开开发者工具 点击Network,找到过滤器 筛选XHR,Method那一列会显示POST GET:

  3. 软件工程实践作业2 --梭哈游戏(java) 实践报告

    一,题目简介: 1.创建一副扑克牌 7------k 加入到集合对象中2.对扑克牌洗牌3.定义参与游戏的玩家的人,通过键盘输入,限定人数2-54.人数符合要求继续执行,不符合退出5.对玩家发牌,每个人 ...

  4. 【Deep Hash】CNNH

    [AAAI 2014] Supervised Hashing via Image Representation Learning [paper] [code] Rongkai Xia , Yan Pa ...

  5. 每天学习SQL

    SELECT table_name FROM information_schema.tables WHERE table_schema='survey170227_main' AND table_na ...

  6. JSP中properties文件的路径问题

    做练习的时候,写了个properties文件,放在src/servlet/目录下,访问文件问题花了点时间折腾,最终得到解决,记下. 环境:eclipse jee oxygen,tomcat 9.0. ...

  7. shell脚本--文件测试

    文件测试是指测试某一个文件或者目录是否存在 测试文件格式[ 操作符 目录或者文件 ]    注意左括号和操作符之间有一个空格,文件或者目录 与右边的括号之间也有一个空格. -d 测试是否为目录 -e ...

  8. Analyze a docker instance start failure

      错误信息:Cannot start container xxxxxxxxxxx | Error getting container xxxxxxxxxxxxxxx  from driver dev ...

  9. java mail session使用Properties的clone方法

    /* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreem ...

  10. Fantacy团队周四站立会议

    词频分析模型 1.会议时间:2016年3月31日12:07~12:30. 持续时长:23分钟 会议参加成员:组长:杨若鹏 http://www.cnblogs.com/robinYangRP/ 组员: ...