原文(参考学习):https://blog.csdn.net/mxiaoyem/article/details/50708052
在网络上看到了该文章,讲的是如何实时监测网络状态, 本人菜鸟一枚,学习该文章,照着代码敲. 感谢该博主的无私分享。
1. 在AndroidManifest.xml中添加权限
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
2. 新建工具类
public class NetUtil {
/**
* 没有连接网络
*/
private static final int NETWORK_NONE = -1;
/**
* 移动网络
*/
private static final int NETWORK_MOBILE = 0;
/**
* 无线网络
*/
private static final int NETWORK_WIFI = 1;
public static int getNetWorkState(Context context) {
// 得到连接管理器对象
ConnectivityManager connectivityManager = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetworkInfo = connectivityManager
.getActiveNetworkInfo();
if (activeNetworkInfo != null && activeNetworkInfo.isConnected()) {
if (activeNetworkInfo.getType() == (ConnectivityManager.TYPE_WIFI)) {
return NETWORK_WIFI;
} else if (activeNetworkInfo.getType() == (ConnectivityManager.TYPE_MOBILE)) {
return NETWORK_MOBILE;
}
} else {
return NETWORK_NONE;
}
return NETWORK_NONE;
}
}
4. 建立接收器
public class NetBroadcastReceiver extends BroadcastReceiver {
public NetEvent event= BaseActivity.event;
@Override
public void onReceive(Context context, Intent intent) {
// 如果相等的话就说明网络状态发生了变化
if (intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
int netWorkState = NetUtil.getNetWorkState(context);
// 接口回调传过去状态的类型
event.onNetChange(netWorkState);
}
}
//自定义网络切换接口
public interface NetEvent {
public void onNetChange(int netMobile);
}
}
由于我自己的测试机子是Android 8.0, 我在接下来的BaseActivity中,采取动态注册,看了原博主的文章,Android 7.0(含)以上需要动态注册,如果是低于这个版本,需要在AndroidManifest.xml添加如下代码, 我的设备是Android 8.0, 就没有添加了。
<receiver android:name="cn.broadcastreceiver.NetBroadcastReceiver" >
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
</receiver>
4. 定义抽象基类BaseActivity当中,进行实现
public abstract class BaseActivity extends AppCompatActivity implements NetBroadcastReceiver.NetEvent
在BaseActivity当中,定义
public NetBroadcastReceiver netBroadcastReceiver;
public static NetBroadcastReceiver.NetEvent event;
private int netMobile;
在onCreate当中,进行接收器动态注册:
event= this;
//实例化IntentFilter对象
IntentFilter filter = new IntentFilter();
filter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
filter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
netBroadcastReceiver = new NetBroadcastReceiver();
registerReceiver(netBroadcastReceiver, filter);
在onDestroy当中释放
unregisterReceiver(netBroadcastReceiver);
添加处理方法
public boolean inspectNet() {
this.netMobile = NetUtil.getNetWorkState(BaseActivity.this);
return isNetConnect();
}
/**
* 判断有无网络 。
*
* @return true 有网, false 没有网络.
*/
public boolean isNetConnect() {
if (netMobile == 1) {
return true;
} else if (netMobile == 0) {
return true;
} else if (netMobile == -1) {
return false;
}
return false;
}
5. 由于BaseActivity是一个抽象类,虽然实现了NetBroadcastReceiver.NetEvent, 但是并无实现方法。 由BaseActivity的子类实现。比如InitActivity继承BaseActivity,
public class InitActivity extends BaseActivity
由InitActivity中实现onNetChange方法, 当在InitActivity对应布局时,网络变化时,会自动触发该事件,我定义了一个变量特地用来存储网络状态, 用于之后的逻辑判断使用.
@Override
public void onNetChange(int netMobile) {
MyApplication.NET_STATUS= netMobile;
}
此时可能会发现, 这样做的话,需要在每一个BaseActivity的子类都要实现这个方法,会比较繁琐。那么BaseActivity就不能写成抽象类, 直接在BaseActivity实现就可以了。以后会注意。
特此记录下使用, 方便以后使用。