Android 监控网络状态
监控网络变化的两种方法:
- 定时不断的去获取网络状态
- 在需要网络请求的时候去获取网络状态
- 注册系统广播
本篇文章主要介绍注册系统广播去实时监控手机网络变化,而Android 8.0广播的修改国内镜像,此处使用动态注册广播实现。
小二,上代码: - BaseActivity
public class BaseActivity extends AppCompatActivity {
private NetworkChangeReceiver receiver;
private TextView tv_info;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_net_work);
tv_info = findViewById(R.id.tv_info);
IntentFilter intentFilter = new IntentFilter();
// android 网络系统广播 -------->>> android.net.conn.CONNECTIVITY_CHANGE
intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
receiver = new NetworkChangeReceiver();
registerReceiver(receiver,intentFilter);
receiver.setOnCheckNetworkCallBack(new NetworkChangeReceiver.CheckNetworkCallBack() {
@Override
public void onChecked() {
String msg = Netinfo.NetMessage.MESSAGE.getMsg();
String net_name = Netinfo.NetType.TYPE_NAME.getType_name();
boolean isUse = Netinfo.Net_state.ISCONNECT.isCanUse();
String state_name = Netinfo.Net_state.ISCONNECT.getState_bame();
tv_info.setText(msg+"\r\n"+net_name+"\r\n"+state_name+"\r\n"+isUse);
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(receiver);
}
}
- activity_net_work.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/tv_info"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
接下来就是广播了。
- NetworkChangeReceiver
public class NetworkChangeReceiver extends BroadcastReceiver {
private String pingUrl = "www.baidu.com";
@Override
public void onReceive(Context context, Intent intent) {
ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo info = manager.getActiveNetworkInfo();
boolean canUse = false;
boolean canConn = false;
if (info != null && info.isAvailable()){
if (info.isConnected()){
canUse = canUse(manager);
canConn = true;
}
Netinfo.Net_state.ISCONNECT.setCanUse(canUse);
Netinfo.Net_state.ISCANUSER.setCanUse(canConn);
Netinfo.NetMessage.MESSAGE.setMsg("网络连接成功");
Netinfo.NetMessage.MESSAGE.setIndex(1);
int netType = info.getType();
if (netType == ConnectivityManager.TYPE_MOBILE){
Netinfo.NetType.TYPE_NAME.setType_name("手机网络");
Netinfo.NetType.TYPE_NAME.setIndex(1);
}else if (netType == ConnectivityManager.TYPE_WIFI){
Netinfo.NetType.TYPE_NAME.setType_name("WIFI网络");
Netinfo.NetType.TYPE_NAME.setIndex(2);
}
}else{
Netinfo.NetMessage.MESSAGE.setMsg("网络断开连接");
Netinfo.NetMessage.MESSAGE.setIndex(2);
Netinfo.Net_state.ISCONNECT.setCanUse(canUse);
Netinfo.Net_state.ISCANUSER.setCanUse(canConn);
Netinfo.NetType.TYPE_NAME.setType_name("无");
Netinfo.NetType.TYPE_NAME.setIndex(3);
}
if (onCheckNetworkCallBack != null){
onCheckNetworkCallBack.onChecked();
}
}
public interface CheckNetworkCallBack{
void onChecked();
}
private CheckNetworkCallBack onCheckNetworkCallBack;
public void setOnCheckNetworkCallBack(CheckNetworkCallBack onCheckNetworkCallBack) {
this.onCheckNetworkCallBack = onCheckNetworkCallBack;
}
/**
* 判断网络可用(能否上网)
* @return
*/
public boolean canUse(ConnectivityManager manager) {
/**
* android 6.0新增了获取网络状态的方法
* 有心之人可以用 360免费WIFI软件分享WIFI给手机用,然后监控下这个 if 和 else
* 里面的日志内容
* 验证步骤:
* 1.连接360免费WIFI不验证
* 2.验证后把电脑设置错误的 MAC地址
* 3 在验证后连接正常上网情况下
**/
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
NetworkCapabilities capabilities = manager.getNetworkCapabilities(manager.getActiveNetwork());
Log.i("Avalible", "NetworkCapabilities:"+capabilities.toString());
return capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED);
}else{
Runtime runtime = Runtime.getRuntime();
try {
Process ipProcess = runtime.exec("ping -c 3 "+pingUrl);
int exitValue = ipProcess.waitFor();
Log.i("Avalible", "Process:"+exitValue);
return (exitValue == 0);
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
return false;
}
public void addPingUrl(String url){
this.pingUrl = url;
}
}
Netinfo.java 这是用来保存我需要的网络部分信息的基类
public class Netinfo {
enum NetMessage{
MESSAGE("网络断开连接",1);
NetMessage(String msg, int index){
this.msg = msg;
this.index = index;
}
private String msg;
private int index;
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public int getIndex() {
return index;
}
public void setIndex(int index) {
this.index = index;
}
}
enum NetType{
TYPE_NAME("手机网络",1);
NetType(String type_name, int index){
this.type_name = type_name;
this.index = index;
}
private String type_name;
private int index;
public String getType_name() {
return type_name;
}
public void setType_name(String type_name) {
this.type_name = type_name;
}
public int getIndex() {
return index;
}
public void setIndex(int index) {
this.index = index;
}
};
enum Net_state{
ISCONNECT("is_connect",true),
ISCANUSER("is_canuser", true);
private String state_bame;
private boolean isCanUse;
Net_state(String state_bame, boolean isCanUse){
this.state_bame = state_bame;
this.isCanUse = isCanUse;
}
public String getState_bame() {
return state_bame;
}
public void setState_bame(String state_bame) {
this.state_bame = state_bame;
}
public boolean isCanUse() {
return isCanUse;
}
public void setCanUse(boolean canUse) {
isCanUse = canUse;
}
}
}
最后是网络权限:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
到此,内容就全部结束了。内容较为简单,就不提供了demo 了,复制代码就可直接运行了,如有错误,欢迎大佬们指正,Thanks !