获取和监听网络状态(自定义接口并回调初识)

获取和监听网络状态 认知 自定义接口的三步法

权限:

 <uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

1. 获取当前网络状态
(1)获取ConnectivityManager实例:

ConnectivityManager manager = (ConnectivityManager) context.getSystemService(context.CONNECTIVITY_SERVICE);

(2)获取存在的NetworkInfo对象:

NetworkInfo networkInfo = manager.getActiveNetworkInfo();

(3)networkInfo.getType()方法区分wifi模式和数据流量模式

if (networkInfo != null && networkInfo.isConnected()) {
if (networkInfo.getType() == ConnectivityManager.TYPE_MOBILE) {
return NETWORK_MOBILE;
} else if (networkInfo.getType() == ConnectivityManager.TYPE_WIFI){
return NETWORK_WIFI;
}
}
return NETWORK_NONE;
}

(4)info.getSubtype() 区分具体网络连接信息
info.getSubtype()取值列表如下:

NETWORK_TYPE_CDMA 网络类型为CDMA
NETWORK_TYPE_EDGE 网络类型为EDGE
NETWORK_TYPE_EVDO_0 网络类型为EVDO0
NETWORK_TYPE_EVDO_A 网络类型为EVDOA
NETWORK_TYPE_GPRS 网络类型为GPRS
NETWORK_TYPE_HSDPA 网络类型为HSDPA
NETWORK_TYPE_HSPA 网络类型为HSPA
NETWORK_TYPE_HSUPA 网络类型为HSUPA
NETWORK_TYPE_UMTS 网络类型为UMTS
联通的3G为UMTS或HSDPA,移动和联通的2G为GPRS或EDGE,电信的2G为CDMA,电信的3G为EVDO
这个方法可用于具体的一些网络判断操作,比如只有4G网络下可加载等特殊情况。

2. 监听网络状态变化
每当网络连接状态发生了变化,ConnectivityManager会广播一个CONNECTIVITY_ACTION(“android.net.conn.CONNECTIVITY_CHANGE”)。
可以注册一个广播接收器接收网络连接变化的广播

//注册监听网络广播(4.0以后动态注册)
 IntentFilter filter=new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE");
        NetStateReceiver netStateReceiver=new NetStateReceiver();
        registerReceiver(netStateReceiver,filter);
        netStateReceiver.setmListener(this);

网络状态变化,触发onReceive(), 通过接口回调传给主线程,更新界面

@Override
public void onReceive(Context context, Intent intent) {
    if (intent.getAction() != null) {
        if (intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
            int netWorkState = NetUtils.getNetWorkState(context);
            if (mListener != null) {
           //调用此接口传递进去你要传递的值(这里只是网络状态)
                 mListener.ChangeListener(netWorkState);

            }
        }
    }
}

回调接口

/**
 * 网络变化回调接口
 */
  //1,接口声明
    public interface NetChangeListener{

        void ChangeListener(int status);
    }

    //2,创建接口“实例”
    NetChangeListener mListener;

    //3,添加set方法供外界使用

    public   void setmListener(NetChangeListener mListener) {
        this.mListener = mListener;
    }

主线程绑定并更新

mNetBroadcastReceiver.setmListener(this);

@Override
public void onNetChangeListener(int status) {
    if (mNetState == status) {
        return;
    }
    mNetState = status;
    if (status == NetUtils.NETWORK_NONE) {
        ToastUtils.show("网络已断开");
        showNetDialog();
    } else if (status == NetUtils.NETWORK_MOBILE || status == NetUtils.NETWORK_WIFI) {
        ToastUtils.show("网络已连接");
        hideNetDialog();
    }
}

手机连接真机:

  1. 在设置中,找到版本号,点击多次,打开“开发者模式”;
  2. 在开发者模式中打开usb调试开关;
  3. 选择文件传输模式(MTP)。

完整小demo模拟机测试:
在这里插入图片描述
在这里插入图片描述
NetworksUtils.class(封装的网络工具类)

package com.example.network.utils;

import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;


public class NetworksUtils {
    public static int getNetworkState(Context context) {
        ConnectivityManager manager = (ConnectivityManager) context.getSystemService(context.CONNECTIVITY_SERVICE);
        NetworkInfo networkInfo = manager.getActiveNetworkInfo();
        if (networkInfo != null && networkInfo.isConnected()) {
            if (networkInfo.getType() == ConnectivityManager.TYPE_MOBILE) {
                return 1;
            } else if (networkInfo.getType() == ConnectivityManager.TYPE_WIFI) {
                return 2;
            }
        }
        return 0;
    }

}

NetStateReceiver.class(广播下声明接口)

package com.example.network;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;

import com.example.network.utils.NetworksUtils;

public class NetStateReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction() != null) {//是否为空,是否变化
            if (intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) {//判断是否连上

                int netWorkState = NetworksUtils.getNetworkState(context);//当前网络状态
                
                //4,使用接口传递数据——(这里是网络状态)
                    mListener.ChangeListener(netWorkState);
                }
            }
        }
    }
    //1,接口声明
    public interface NetChangeListener{

        void ChangeListener(int status);
    }

    //2,创建接口“实例”
    NetChangeListener mListener;

    //3,添加set方法供外界使用

    public   void setmListener(NetChangeListener mListener) {
        this.mListener = mListener;
    }

}

MainActivity.class(活动类中去实现广播中的接口来实现实时判断网络的状态并弹出相应提升):

package com.example.network;

import android.content.IntentFilter;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Toast;

import com.example.network.utils.NetworksUtils;

public class MainActivity extends AppCompatActivity
{
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //初始状态显示
        int state= NetworksUtils.getNetworkState(getApplicationContext());
        showToast( state);

        //动态注册
        IntentFilter filter=new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE");
        NetStateReceiver netStateReceiver=new NetStateReceiver();
        registerReceiver(netStateReceiver,filter);
   


      //实现了接口并重写了刚刚做的那个自定义接口中的ChangeListener方法
       netStateReceiver.setmListener(new NetStateReceiver.NetChangeListener() {
            @Override
            public void ChangeListener(int status) {
                showToast(status);
            }
        });


    }




    //写的一个显示网络状态消息的方法
    void showToast(int state){
        switch (state){
            case 0:
                Toast.makeText(this, "断网啦~", Toast.LENGTH_SHORT).show();
                break;
            case 1:
                Toast.makeText(this, "手机流量", Toast.LENGTH_SHORT).show();
                break;
            case 2:
                Toast.makeText(this, "WIFI数据", Toast.LENGTH_SHORT).show();
                break;
        }
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值