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
Android: 网络随时需要在3G和Wifi切换,网络程序需要注意的更多相关文章
- android 获取网络类型名称2G 3G 4G wifi
首先工程Manifest文件要引用: <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" ...
- Android网络类型判断(2g、3g、wifi)
判断网络类型是wifi,还是3G,还是2G网络,对不同 的网络进行不同的处理,现将判断方法整理给大家,以供参考 说明:下面用到的数据移动2G,联通2G,联通3G,wifi我都已经测试过,暂时手上 ...
- 转:Android 判断用户2G/3G/4G移动数据网络
Android 判断用户2G/3G/4G移动数据网络 在做 Android App 的时候,为了给用户省流量,为了不激起用户的愤怒,为了更好的用户体验,是需要根据用户当前网络情况来做一些调整的,也可以 ...
- Android 判断用户2G/3G/4G移动数据网络
Android 判断用户2G/3G/4G移动数据网络 在做 Android App 的时候,为了给用户省流量,为了不激起用户的愤怒,为了更好的用户体验,是需要根据用户当前网络情况来做一些调整的,也可以 ...
- 判断是否联网_检测网络的类型为3G、2G、wap、wifi
判断是否联网_检测网络的类型为3G.2G.wap.wifi 判断是否联网: /*** * judge Internet is available * * @author wei-spring * @ ...
- Android判断用户的网络类型(2/3/4G、wifi)
很多时候需要先判断当前用户的网络,才会继续之后的一些处理逻辑.但网络类型获取这一块,我用我自己的的手机调试时遇到一些问题,这里记录一下. 一加手机一代,移动4G 网络,得到的subtype类型值为17 ...
- 九、Android学习第八天——广播机制与WIFI网络操作(转)
(转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 九.Android学习第八天——广播机制与WIFI网络操作 今天熟悉了An ...
- Swift - 判端网络连接状态,连接类型(3G还是Wifi)
IJReachability是一个使用Swift写的第三方网络检测类.可以测试网络是否连接,并支持3G和Wifi的检测. 使用样例: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ...
- 蜂窝移动网络是什么,它和 Wi-Fi 有什么区别? 蓝牙和无线有什么区别?
蜂窝移动网络是什么,它和 Wi-Fi 有什么区别? 转自知乎用户的一个回答: 原题问的是"数据流量是什么",不知道怎么又被改成"蜂窝移动网络是什么"了.说下个人 ...
随机推荐
- 必应词典案例分析——个人博客作业week3
案例分析 ——必应词典客户端 软件缺陷常常又被叫做Bug,即为计算机软件或程序中存在的某种破坏正常运行能力的问题.错误,或者隐藏的功能缺陷. 缺陷的存在会导致软件产品在某种程度上不能满足用户的需要.I ...
- 如何实现基于ssh框架的投票系统的的质量属性
如何实现基于ssh框架的投票系统的的质量属性: 项目 :网上考试系统 我做的是网上考试系统,因为标准化的考试越来越重要,而通过计算机进行标准化判卷,系统会自动判卷出成绩,组织考试的人不用组织人员打印试 ...
- 第三个Sprint冲刺第六天(燃尽图)
- 软件工程(GZSD2015)学生博客列表
2015年贵州师范大学软件工程课程学生博客列表 陈小丽 郑倩 唐洁 周娟 李利思 肖俊 罗文豪 周静 徐明艳 毛涛 邓洪虹 岳庆 李盼 安坤 何亚 涂江凤 张义平 杨明颢 杨家堂 胡贵玲 寿克霞 吴明 ...
- ThreadPoolExecutor源码解读
1. 背景与简介 在Java中异步任务的处理,我们通常会使用Executor框架,而ThreadPoolExecutor是JUC为我们提供的线程池实现. 线程池的优点在于规避线程的频繁创建,对线程资源 ...
- Why yarn
http://www.cnblogs.com/LeftNotEasy/archive/2012/02/18/why-yarn.html https://www.ibm.com/developerwor ...
- IE下JS保存图片
function ieSave() { var img = document.images[0]; ...
- charCodeAt与fromCharCode
charCodeAt() 方法可返回指定位置的字符的 Unicode 编码 这个返回值是 0 - 65535 之间的整数. stringObject.charCodeAt(index) /* a-z ...
- Python文件os模块
一.文件操作 1.打开一个文件 fo = open("foo.txt", "wb") fo.write( "www.runoob.com!\nVery ...
- C++与C的区别
在最开始C++只是C加上了一些面向对象的特性,C++最初的名字为C with Classes.后来C++又提出了一些不同于Class的特性:Exceptions(异常).templates(模板).S ...