Android中网络情况时有变化,比如从有网到没网,从wifi到gprs,gprs又从cmwap到cmnet...等等!
现在APP程序功能都是需要网络支持的,有时候就需要监听到网络的变化情况进行相应的处理。
比如说下载一个文件,如果突然断网了,怎么处理?网络又恢复了,如何监听到并重连?
当网络变化的时候系统会发出义个广播broadcast,只要在程序中注册一个广播接收器BroadcastReceiver,并在IntentFilter中添加相应的过滤,这样一旦网络有变化,程序就能监听到 :
这里我们采用动态注册。
代码示例:
BroadcastReceiver netReceiver =new BroadcastReceiver(){
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(
Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
if (networkInfo != null && networkInfo.isAvailable()) {
int type2 = networkInfo.getType();
String typeName = networkInfo.getTypeName();
tv.setText(type2+"--"+typeName);
switch (type2) {
case 0://移动 网络 2G 3G 4G 都是一样的 实测 mix2s 联通卡
break;
case 1: //wifi网络
break;
case 9: //网线连接
break;
}
} else {// 无网络
tv.setText("not connect");
}
}
}
};
在activity里面的oncreate注册,注册的方式有两种,静态和动态注册。他们的区别是
1.静态注册。在清单文件minnifest注册。不随activity的生命周期变化而变化,也就是activity摧毁后,广播还在。
2.动态注册。activty销毁,广播失效 。
代码示例:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView)findViewById(R.id.tv);
initReceiver();
}
/**
* 注册网络监听的广播
*/
private void initReceiver() {
IntentFilter timeFilter = new IntentFilter();
timeFilter.addAction("android.net.ethernet.ETHERNET_STATE_CHANGED");
timeFilter.addAction("android.net.ethernet.STATE_CHANGE");
timeFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
timeFilter.addAction("android.net.wifi.WIFI_STATE_CHANGED");
timeFilter.addAction("android.net.wifi.STATE_CHANGE");
timeFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
registerReceiver(netReceiver, timeFilter);
}
当网络变化时,从有网到没网也会发广播,就举的例子来说,如果下载时断网了,接收到广播的时候要判断当前网络是可用还是不可用状态,如果可用进行什么操作;不可用进行什么操作:
最后销毁
代码示例:
@Override
protected void onDestroy() {
super.onDestroy();
if (netReceiver != null) {
unregisterReceiver(netReceiver);
netReceiver = null;
}
非常重要的权限不要忘记
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
最后:可使用动态权限,看看如何添加动态权限