Android网络状态监听

	
Android网络状态监听

Android经常需要去判断网络的状态,比如下载。请求到一半了,网络中断了,要做什么处理,网络有通了,能不能继续自动监听继续下载。所以网络监听对很多网络请求还是很重要的。这里不知道网络什么时候来,什么时候断。故要设计一个广播来监听网络状态,当网络状态发生改变的时候去通知该做什么处理。

0,写一个判断网络的工具类(可以直接写在广播中)

1,写一个广播类去监听网络变化

2,在广播类中设置接口,在Activity中回调做相应的处理

3,可以在baseactivity中设置回调,比较网络请求很多类都需要。

步骤:

0:工具类:大体都是这样的

package com.hu.netclick;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;

/**
 * 跟网络相关的工具类
 *
 *
 *
 */
public class NetUtils
{
    private NetUtils()
    {
        /* cannot be instantiated */
        throw new UnsupportedOperationException("cannot be instantiated");
    }

    /**
     * 判断网络是否连接
     *
     * @param context
     * @return
     */
    public static boolean isConnected(Context context)
    {

        ConnectivityManager connectivity = (ConnectivityManager) context
                .getSystemService(Context.CONNECTIVITY_SERVICE);

        if (null != connectivity)
        {

            NetworkInfo info = connectivity.getActiveNetworkInfo();
            if (null != info && info.isConnected())
            {
                if (info.getState() == NetworkInfo.State.CONNECTED)
                {
                    return true;
                }
            }
        }
        
        return false;
    }

    /**
     * 判断是否是wifi连接
     */
    public static boolean isWifi(Context context)
    {
        ConnectivityManager cm = (ConnectivityManager) context
                .getSystemService(Context.CONNECTIVITY_SERVICE);

        if (cm == null)
            return false;
        return cm.getActiveNetworkInfo().getType() == ConnectivityManager.TYPE_WIFI;

    }


    /**
     * 没有连接网络
     */
    public static final int NETWORK_NONE = -1;
    /**
     * 移动网络
     */
    public static final int NETWORK_MOBILE = 0;
    /**
     * 无线网络
     */
    public 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;
    }
    
    /**
     * 打开网络设置界面
     */
    public static void openSetting(Activity activity)
    {
        Intent intent = new Intent("/");
        ComponentName cm = new ComponentName("com.android.settings",
                "com.android.settings.WirelessSettings");
        intent.setComponent(cm);
        intent.setAction("android.intent.action.VIEW");
        activity.startActivityForResult(intent, 0);
    }

}

1:广播监听。这里就直接在主MainActivity中设置回调了
package com.hu.netclick;

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


/**
 * Created by hu on 2016/11/28.
 */
public class NetBroadcastReceiver extends BroadcastReceiver {
    public NetEvevt evevt = MainActivity.evevt;

    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
            //获取当前网络状态码
            int netWorkState = NetUtils.getNetWorkState(context);
            // 接口回调传过去状态的类型
            evevt.onNetChange(netWorkState);
        }
    }


    // 自定义接口
    public interface NetEvevt {
        public void onNetChange(int netMobile);
    }
}

记得在配置清单中配置

            
                
            
        
权限别忘记了:
 
    
    
    
    
2,主MainActivity中的实现接口:
package com.hu.netclick;

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

public class MainActivity extends AppCompatActivity implements NetBroadcastReceiver.NetEvevt {

    public static NetBroadcastReceiver.NetEvevt evevt;
    /**
     * 网络类型
     */
    private int netMobile;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        evevt = this;
    }


    /**
     * 初始化时判断有没有网络
     */

    public boolean inspectNet() {
        this.netMobile = NetUtils.getNetWorkState(MainActivity.this);

        return isNetConnect();
    }

    /**
     * 判断有无网络 。
     *
     * @return true 有网, false 没有网络.
     */
    public boolean isNetConnect() {
        if (netMobile == NetUtils.NETWORK_WIFI) {
            return true;
        } else if (netMobile == NetUtils.NETWORK_MOBILE) {
            return true;
        } else if (netMobile == NetUtils.NETWORK_NONE) {
            return false;

        }
        return false;
    }

    /***
     * 网络变化后的回调,这里处理相关逻辑
     * @param netMobile
     */
    public void onNetChange(int netMobile) {
        this.netMobile = netMobile;
        //网络状态变化时的操作
        if (!isNetConnect()) {
            Toast.makeText(getApplicationContext(),"没有网",Toast.LENGTH_SHORT).show();
        } else {
            Toast.makeText(getApplicationContext(),"有网",Toast.LENGTH_SHORT).show();
        }

    }
}

基本上监听功能就实现了。简单的效果图:



所以类都给出来了,demo就算了

现在又加需求了,需要网速好的情况下才能请求数据或者支付,以免数据丢包了。

所以需要测网速。测网速可以TrafficInfo流量类来测试网速。
这里介绍一个测网速的

Facebook给我们提供了这么一个库:在 gradle引入

compile 'com.facebook.network.connectionclass:connectionclass:1.0.1'

facebook/network-connection-class  gethub地址


这里给个他人博客介绍地址: 点击打开链接



你可能感兴趣的:(工作的学习)