平时,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. apache工作模式总结及网站访问缓慢处理记录

    apache目前主要有两种模式:prefork模式和worker模式:1)prefork模式(默认模式)prefork是Unix平台上的默认(缺省)MPM,使用多个子进程,每个子进程只有一个线程.每个 ...

  2. C_数据结构_递归A函数调用B函数

    # include <stdio.h> int g(int); int f(int); int f(int n) { ) printf("haha\n"); else ...

  3. Linux内核分析 第七周 可执行程序的装载

    张嘉琪 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 Linux内核分析 第七 ...

  4. cglib 动态代理

    JDK的动态代理比较慢,可以使用cglib的代理,速度比较快: package cn.demo02; import java.lang.reflect.Method; import java.util ...

  5. 第六次作业-my Backlog

    杨灵超小组 My  Backlog                                小学生四则运算自动生成(Backlog) ID Name IMP EST How   to Demo ...

  6. 20172319 《Java程序设计教程》第8周学习总结

    20172319 2018.04.24-05.03 <Java程序设计教程>第8周学习总结 目录 教材学习内容总结 教材学习中的问题和解决过程 代码调试中的问题和解决过程 代码托管 上周考 ...

  7. Geekers团队成立日志

    大家好,作为团队的队长,今天在这里非常荣幸能够发表我们团队的第一篇博客,来宣布我们团队的名字:Geekers! Geek,英文中代表“怪人”,随着时代进步Geek被赋予了新的含义——极客!Steve ...

  8. 爬虫时http错误提示

    在爬虫,请求网站的时候,有时候出现域名报错,所出现的代码所对应的意思:

  9. ECharts设置y轴显示

    参考地址:https://www.w3cschool.cn/echarts_tutorial/echarts_tutorial-no3h2cul.html yAxis: { type: 'value' ...

  10. Raphaël - JavaScript Vector Library

    Raphaël http://dmitrybaranovskiy.github.io/raphael/ // ┌──────────────────────────────────────────── ...