Android 监控网络状态

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 !

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值