監聽網絡連接的變更
package com.fengtai.utils;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.telephony.TelephonyManager;
import java.util.ArrayList;
import java.util.List;
/**
* 監聽網絡改變的廣播接收者
* @author Administrator
*
*/
public class NetChangeReceiver extends BroadcastReceiver {
/**
* 枚舉網絡狀態
* NET_NO:沒有網絡
* NET_2G:2g網絡
* NET_3G:3g網絡
* NET_4G:4g網絡
* NET_WIFI:wifi
* NET_UNKNOWN:未知網絡
*/
public static enum NetState{NET_NO,NET_2G,NET_3G,NET_4G,NET_WIFI,NET_UNKNOWN};
public static List<NetEventHandle> ehList = new ArrayList<NetEventHandle>();
public static interface NetEventHandle {
/**
* 網絡狀態碼
* @param netCode
*/
void netState(NetState netCode);
}
@Override
public void onReceive(Context context, Intent intent) {
//向所有實現接口的activity傳遞消息
for (NetEventHandle e : ehList) {
e.netState(isConnected(context));
}
}
/**
* 判斷當前是否網絡連接,返回網絡類型
*
* @param context
* @return 狀態碼
*/
public static NetState isConnected(Context context) {
NetState stateCode = NetState.NET_NO;
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo ni = cm.getActiveNetworkInfo();
if (ni != null && ni.isConnectedOrConnecting()) {
switch (ni.getType()) {
case ConnectivityManager.TYPE_WIFI:
stateCode = NetState.NET_WIFI;
break;
case ConnectivityManager.TYPE_MOBILE:
switch (ni.getSubtype()) {
case TelephonyManager.NETWORK_TYPE_GPRS: //聯通2g
case TelephonyManager.NETWORK_TYPE_CDMA: //電信2g
case TelephonyManager.NETWORK_TYPE_EDGE: //移動2g
case TelephonyManager.NETWORK_TYPE_1xRTT:
case TelephonyManager. NETWORK_TYPE_IDEN:
stateCode = NetState.NET_2G;
break;
case TelephonyManager.NETWORK_TYPE_EVDO_A: //電信3g
case TelephonyManager.NETWORK_TYPE_UMTS:
case TelephonyManager.NETWORK_TYPE_EVDO_0:
case TelephonyManager.NETWORK_TYPE_HSDPA:
case TelephonyManager.NETWORK_TYPE_HSUPA:
case TelephonyManager.NETWORK_TYPE_HSPA:
case TelephonyManager.NETWORK_TYPE_EVDO_B:
case TelephonyManager.NETWORK_TYPE_EHRPD:
case TelephonyManager.NETWORK_TYPE_HSPAP:
stateCode = NetState.NET_3G;
break;
case TelephonyManager.NETWORK_TYPE_LTE:
stateCode = NetState.NET_4G;
break;
default:
stateCode = NetState.NET_UNKNOWN;
}
break;
default:
stateCode = NetState.NET_UNKNOWN;
}
}
return stateCode;
}
}
在Activity的中實現NetEventHandle藉口。實現裏邊的抽象方法。
@Override
public void netState(NetState netCode) {
// TODO Auto-generated method stub
getNetState(netCode);
}
/**
* 判斷當前的網絡狀態
* @param netCode
*/
public void getNetState(NetState netCode) {
switch (netCode) {
case NET_NO:
System.out.println("沒有網絡連接");
break;
case NET_2G:
System.out.println("2g網絡");
if(IMflag==1){
LoginIM();
}
break;
case NET_3G:
System.out.println("3g網絡");
if(IMflag==1){
LoginIM();
}
break;
case NET_4G:
System.out.println("4g網絡");
if(IMflag==1){
LoginIM();
}
break;
case NET_WIFI:
System.out.println("WIFI網絡");
if(IMflag==1){
LoginIM();
}
break;
case NET_UNKNOWN:
System.out.println("未知網絡");
break;
default:
}
}
注意:還有在Activity的OnCreate方法中,添加NetChangeReceiver.ehList.add(this);在OnDestory()中添加NetChangeReceiver.ehList.remove(this);