做一个Android监听网络实时变化,于是想到了广播。于是乎按照实现一个广播步骤:
1.新建一个类继承广播,在广播内判断网络变化。当网络发生变化时,给定义的接口发送通知。具体代码如下
public class NetBroadcastReceiver extends BroadcastReceiver {
public NetEvevt evevt = BaseAct.evevt;
public NetEvevt baseLazyEvevt = BaseLazyLoadFragment.evevt;
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
// 如果相等的话就说明网络状态发生了变化
if (intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
int netWorkState = NetUtil.getNetWorkState(context);
// 接口回调传过去状态的类型
if (evevt != null)
evevt.onNetChange(netWorkState);
if (baseLazyEvevt!=null)
baseLazyEvevt.onNetChange(netWorkState);
}
}
// 自定义接口
public interface NetEvevt {
public void onNetChange(int netMobile);
}
2.注册广播,在AndroidMainfest.xml文件中注册刚才自己的广播。注册代码如下
<receiver android:name=".ui.receiver.NetBroadcastReceiver">
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
</receiver>
于是做完上面操作,运行程序,进行断网,连网测试。发现Android 4.4 和 Android 6.0运行没问题。但是Android8.0上面接收不到广播。于是百度发现,原来原因是:在Android8.0行为变更,静态注册的广播将接收不到
解决方案是,需要动态注册。于是在Application里面进行该广播的动态注册,注册代码如下:
NetBroadcastReceiver receiver = new NetBroadcastReceiver (); IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE"); this.registerReceiver(receiver, intentFilter);
在运行Android8.0完美兼容。