动态广播监听网络状态

BroadcastReceiver作为安卓四大控件之一用到的地方还是蛮多的,今天我们就来学习动态注册广播的方式来监听网络的改变状态
首先

//网络状态广播接收者
private NetworkStateReceiver netWorkReceiver;
 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //注册网络状态监听广播
        netWorkReceiver = new NetworkStateReceiver();
        IntentFilter filter = new IntentFilter();
        filter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
        filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
        filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
        registerReceiver(netWorkReceiver, filter);
    }

切记切记,一定要在onDestroy()方法或者onPause()方法里面取消掉注册,不然可能会引起内存泄漏,顺便插一句为什么说在onPause()方法里面取消注册也可,因为Activity销毁前一定会先执行onPause()方法,然后在执行onStop()方法,然后才会销毁,在内存不足的情况下,可能连onDestory()方法都执行不了就被系统强制销毁了,但是一定会执行onPause()方法,但是现在生产的手机运行内存都会比较大,这种情况出现的概率会更小。这个算是一个小知识

  @Override
    protected void onDestroy() {
        super.onDestroy();
        if (netWorkReceiver != null) {
            unregisterReceiver(netWorkReceiver);
        }
    }

然后就是广播接收者的代码

public class NetworkStateReceiver extends BroadcastReceiver {

    private static long WIFI_TIME = 0;
    private static long ETHERNET_TIME = 0;
    private static long NONE_TIME = 0;
    private static int LAST_TYPE = -3;
    private static String TAG = "Base";

    @Override
    public void onReceive(Context context, Intent intent) {
 
        if (intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
            long time = getTime();
            if (time != WIFI_TIME && time != ETHERNET_TIME && time != NONE_TIME) {
                final int netWorkState = getNetWorkState(context);
                if (netWorkState == 0 && LAST_TYPE != 0) {
                    WIFI_TIME = time;
                    LAST_TYPE = netWorkState;
                    Toast.makeText(context, "WIFI", Toast.LENGTH_SHORT).show();
                } else if (netWorkState == 1 && LAST_TYPE != 1) {
                    ETHERNET_TIME = time;
                    LAST_TYPE = netWorkState;
                    Toast.makeText(context, "移动网络", Toast.LENGTH_SHORT).show();
                } else if (netWorkState == -1 && LAST_TYPE != -1) {
                    NONE_TIME = time;
                    LAST_TYPE = netWorkState;
                    Toast.makeText(context, "无网络", Toast.LENGTH_SHORT).show();
                }
            }
        }
    }


    private static final int NETWORK_NONE = -1;  //无网络连接
    private static final int NETWORK_WIFI = 0;   //连接的是WIFI
    private static final int NETWORK_MOBILE = 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;
    }

}

代码基本就是这些,然后就是如果有一些其他业务逻辑的话就在onReceive()方法里面写清,但是onReceive()方法里面是不可以执行耗时操作的不然App会报错,希望大家写的时候注意

猜你喜欢

转载自blog.csdn.net/m0_46366678/article/details/125563270