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 有什么区别? 转自知乎用户的一个回答: 原题问的是"数据流量是什么",不知道怎么又被改成"蜂窝移动网络是什么"了.说下个人 ...
随机推荐
- css-preprocessors
what ? 预处理器是css 能够使用 变量.操作符.函数.mixins.interpolations 等类似于js 功能的一种语言. 目前比较常用是三种:SASS.less .stylus . W ...
- python基础学习笔记(八)
创建自已对象就python非常核心的概念,事实上,python被称为面向对象语言,本章会介绍如何创建对象.以及面向对象的概念:继承.封装.多态. 多态: 可对不同类的对象使用同样的操作. 封装:对外部 ...
- [Beta阶段]展示博客
一.团队成员简介与个人博客地址 团队博客地址:http://www.cnblogs.com/wowotoubuaa/ 江昊,项目经理http://www.cnblogs.com/haoj/ 王开,后端 ...
- 【课程总结】Linux内核分析课程总结
程涵 原创博客 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 每周实验报告: 反汇编一个简单的C程序 ...
- Leetcode——58.最后一个单词的长度
给定一个仅包含大小写字母和空格 ' ' 的字符串,返回其最后一个单词的长度. 如果不存在最后一个单词,请返回 0 . 说明:一个单词是指由字母组成,但不包含任何空格的字符串. 示例: 输入: &quo ...
- 单工程搭建springmvc+spring+mybatis(maven,idea)
单工程搭建springmvc+spring+mybatis(maven,idea) 1.pom.xml <properties> <project.build.sourceEncod ...
- CentOS(6.8)7 安装 Mysql 5.7
https://blog.csdn.net/zyw_java/article/details/70949596 https://blog.csdn.net/yzl11/article/details/ ...
- Disabling Chrome cache for website development
https://stackoverflow.com/questions/5690269/disabling-chrome-cache-for-website-development https://s ...
- FreeMaker使用HashMap
private Map<String, Object> variables; <input type="hidden" id="tongzhisbm&q ...
- [转帖]看完这篇文章你还敢说你懂JVM吗?
看完这篇文章你还敢说你懂JVM吗? 在一些物理内存为8g的服务器上,主要运行一个Java服务,系统内存分配如下:Java服务的JVM堆大小设置为6g,一个监控进程占用大约 600m,Linux自身使用 ...