平时,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); //原因,因什么而changeif (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