1)在开发android应用时,涉及到要进行网络访问,时常需要进行网络状态的检查,以提供给用户必要的提醒。一般可以通过ConnectivityManager来完成该工作。
2)实时监听网络变化功能的实现步骤:
1.定义一个Receiver重写其中的onReceive方法,在其中完成所需要的功能
public class NetworkReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
ConnectivityManager manager =
(ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = manager.getActiveNetworkInfo();
int type = -1;
if (networkInfo != null && networkInfo.isAvailable()) {
type = networkInfo.getType();
onNetworkChange(type);
}
}
}
}
public void onNetworkChange(int type) {
switch (type) {
case ConnectivityManager.TYPE_WIFI:
Toast.makeText(this, "TYPE_WIFI", 0).show();
break;
case ConnectivityManager.TYPE_MOBILE:
Toast.makeText(this, "TYPE_MOBILE", 0).show();
break;
case ConnectivityManager.TYPE_ETHERNET:
Toast.makeText(this, "TYPE_ETHERNET", 0).show();
break;
default:
Toast.makeText(this, "TYPE_NONE", 0).show();
break;
}
}
2.在适当的地方注册Receiver,可以在程序中注册,在onCreate中调用如下函数即可:
private void registerReceiver() {
NetworkReceiver receiver = new NetworkReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
registerReceiver(receiver, filter );
}
3、在适当时取消注册Receiver,可以在程序中取消,在onDestroye中调用如下函数即可:
private void unregisterReceiver() {
if(receiver != null){
unregisterReceiver(receiver);
}
}
4、记得添加访问网络需要的权限
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.INTERNET" />
获取当前网络类型
public String getNetworkType(Context context) {
String strNetworkType = "UnKnown";
final NetworkInfo activeNetworkInfo = ((ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE)).getActiveNetworkInfo();
if (activeNetworkInfo != null && activeNetworkInfo.getType() == 1) {
strNetworkType = "WIFI";
}else if (activeNetworkInfo != null && activeNetworkInfo.getType() == 0) {
String subtypeName = activeNetworkInfo.getSubtypeName();
switch (((TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE)).getNetworkType()) {
case TelephonyManager.NETWORK_TYPE_GPRS:
case TelephonyManager.NETWORK_TYPE_EDGE:
case TelephonyManager.NETWORK_TYPE_CDMA:
case TelephonyManager.NETWORK_TYPE_1xRTT:
case TelephonyManager.NETWORK_TYPE_IDEN: //api<8 : replace by 11
strNetworkType = "2G";
break;
case TelephonyManager.NETWORK_TYPE_UMTS:
case TelephonyManager.NETWORK_TYPE_EVDO_0:
case TelephonyManager.NETWORK_TYPE_EVDO_A:
case TelephonyManager.NETWORK_TYPE_HSDPA:
case TelephonyManager.NETWORK_TYPE_HSUPA:
case TelephonyManager.NETWORK_TYPE_HSPA:
case TelephonyManager.NETWORK_TYPE_EVDO_B: //api<9 : replace by 14
case TelephonyManager.NETWORK_TYPE_EHRPD: //api<11 : replace by 12
case TelephonyManager.NETWORK_TYPE_HSPAP: //api<13 : replace by 15
strNetworkType = "3G";
break;
case TelephonyManager.NETWORK_TYPE_LTE:
strNetworkType = "4G";
break;
default:
if (subtypeName.equalsIgnoreCase("TD-SCDMA") || subtypeName.equalsIgnoreCase("WCDMA") || subtypeName.equalsIgnoreCase("CDMA2000")) {
strNetworkType = "3G";
break;
}
strNetworkType = subtypeName;
break;
}
}
return strNetworkType;
}