解决android实时监控网络状态,广播重复接收的问题
当我们想要在自己的项目中,实现网络状态的监控,例如:当网络状态发生变化时,我们给出Dialog提示。我们会使用广播来实现。
不过在使用中我们会发现,那就是广播会重复接收。也就是说,我们在网络状态发生变化时,会接收2次。我们如果使用Dialog给出提示,那么它就会被多次执行,即弹出2次。(此文用Toast代替dialog)
下面就来解决一下广播重复接收的问题。
1、首先定义一个布尔变量,用来记录广播的执行
private static boolean isNetAvailable=false; //声明布尔变量控制广播执行
private nteWorkChangeReceive;//广播
private IntentFilter intentFilter;
广播
class NteWorkChangeReceive extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
ConnectivityManager connectivityManager=(ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo=connectivityManager.getActiveNetworkInfo();
//网络连接成功执行此段代码
if(networkInfo!=null&&networkInfo.isAvailable()){
if(!isNetAvailable){
isNetAvailable=true;
Toast.makeText(context, "网络连接", Toast.LENGTH_SHORT).show();
Log.d("Receive1", "连接");
}
}else {
//网络连接失败执行此段代码
if(isNetAvailable){
isNetAvailable=false;
Toast.makeText(context, "网络断开", Toast.LENGTH_SHORT).show();
Log.d("Receive1", "断开");
}
}
}
}
这样通过布尔变量控制就可以实现当网络状态发生变化时,仅执行一次。
3在Activity oncreate()中
intentFilter=new IntentFilter();
intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
nteWorkChangeReceive=new NteWorkChangeReceive();
registerReceiver(nteWorkChangeReceive,intentFilter);
这样就解决网络状态改变,广播重复接收问题。
Demo gitHub地址