Android手机在网络状态发生改变的时候回发送一条广播。通过日志打印,可以看到该条广播的Action为:android.net.conn.CONNECTIVITY_CHANGE,但是在网络断开和连接的时候或者由WIFI转为移动网络的时候发送的广播的Action同为上述的Action,那么我们如何知道当前是网络连接还是断开呢?接下来我们就会用到ConnectivityManager这个类,ConnectivityManager可以通过获取系统Service获得:
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
通过connectivityManager又可以获得WIFI网络或者移动网络的连接状态
NetworkInfo mobileInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
NetworkInfo wifiInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
因此,我们可以自定义一个BroadcastReceiver,监听到网络状态后通过接口将该状态对外暴露出去
public class NetBroadcastReceiver extends BroadcastReceiver {
private NetConnectedListener netConnectedListener;
@Override
public void onReceive(Context context, Intent intent) {
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo mobNetInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
NetworkInfo wifiNetInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
if (!mobNetInfo.isConnected() && !wifiNetInfo.isConnected()) {
//WIFI和移动网络均未连接
netContentListener.netContent(false);
} else {
//WIFI连接或者移动网络连接
netContentListener.netContent(true);
}
}
public void setNetConnectedListener(NetConnectedListener netConnectedListener) {
this.netConnectedListener = netConnectedListener;
}
public interface NetConnectedListener {
void netContent(boolean isConnected);
}
}
然后在需要监听此状态的Activity中动态注册该BroadcastReceiver即可
NetBroadcastReceiver receiver = new NetBroadcastReceiver();
IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
this.registerReceiver(receiver, filter);
receiver.setNetContentListener(new NetBroadcastReceiver.NetContentListener() {
@Override
public void netContent(boolean isConnected) {
//在此处处理具体业务即可
}
});