一个基于广播监听Android网络状态监听框架

最近工作事情比较少,时间充裕,就自己研究下Android网络监听的基类,关于网络监听,其实这个功能也挺重要的,这一块的内容网上也很多,但说实话,网上的这一块资料很杂,很多也只是介绍下基础的网络建立的工具类,只能说是学习,没有系统的给出在项目中有用的处理方案,看了很多都不怎么满意。俗话说,没有轮子就自己造嘛。于是就根据网上的资料,自己写了个简单的网络监听的框架,希望能帮助大家,同时也希望大家能指正。

其实最开始实现网络监听的思路我想到了两种,因为应用使用过程中,网络是随时都可能变化的,所有必须要实时监听,于是我就想到通过一个server服务在后台一直监听网络情况,当网络变化时就弹出一个吐司(Toast)提示,然后监听到后去做自己的逻辑处理,但是想了下,如果服务一直在后台运行的话可能会对资源消耗较大,不利于优化,那有没有其他比较好的方法呢,其实可以将监听网络的工作放在一个基类中,通过接口回调的方式来处理监听后的逻辑,子类只需要继承这个基类就可以了,这确实是一个比较好的方案。那么就按照这个思路来完成这个功能吧。

其实上面说到的这两种监听方案,实现的原理都是通过广播的方式,因为当网络状态变化时,系统会发出

android.net.conn.CONNECTIVITY_CHANGE
的广播,那么我们知道广播监听有两种方式,一种是动态监听,一种是静态监听,那么我们应该用那种监听方式呢,当然是动态监听啦,动态监听的好处是我们可以在activity的生命周期中按照自己的需求进行注销,这个就给了用户很好的交互感,如果用静态的方式,试想一下,当用户把应用退到后台时,这时网络发生变化,那我们的因为还在后台运行,也就会去处理网络变化的逻辑,比如弹出个提示框说网络变化了呀,这个给用户一个及其不好的用户体验。好了,废话说了这么多,上代码吧

首先,因为涉及到网络,所有相应的权限肯定是要开的,在manifest.xml中,要加上如下权限:


    
然后要监听网络状态,就要实现一个广播来监听,代码如下:

public class NetworkChangeReceiver extends BroadcastReceiver {
    public static String TAG = "NetworkChangeReceiver";
    public NetEvevt evevt = BaseActivity.evevt;
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d("Hxh","MainActivity:"+intent.getAction());
        
        if (intent.getAction().equals("android.net.conn.CONNECTIVITY_CHANGE")) {
            //Toast.makeText(context, "network change", Toast.LENGTH_SHORT).show();
            evevt.onNetChange(NetUtil.getNetWorkState(context));
        }

    }
    public interface NetEvevt {
        public void onNetChange(int netModel);    //网络状态改变时的回调
    }

}
广播中实现了一个接口,用于处理监听到广播后的逻辑,基类中实现这个接口;当然,里面也用到一个网络工具类NetUtil,通过他的getNetWorkState()方法获取网络状态,代码如下:

public class NetUtil {
    /**
     * 无网络状态
     */
    private static final int NETWORK_NONET = -1;
    /**
     * 数据网络状态
     */
    private static final int NETWORK_DATA = 0;
    /**
     * WIFI网络状态
     */
    private static final int NETWORK_WIFI = 1;
    /**
     * 网络不可用状态
     */
    private static final int NETWORK_NO_WORK = 100;
    /**
     * wifi网络状态,且网络可用
     */
    public static final int WIFI_NET_WORKED =201;
    /**
     * WiFi网络不可用
     */
    public static final int WIFI_NET_USELESS = 200;
    /**
     * wifi状态未连接(网络是否可用未知)
     */
    public static final int WIFI_STATU_DISABLE = 300;
    /**
     * WiFi状态已连接(网络是否可用未知)
     */
    public static final int WIFI_STATU_ENABLE =301;
    /**
     * WiFi正在断开中
     */
    public static final int WIFI_STATU_DISABLING = 302;
    /**
     * WiFi正在连接中(网络是否可用未知)
     */
    public static final int WIFI_STATU_ENABLING = 303;
    /**
     * WiFi未知状态
     */
    public static final int WIFI_STATU_UNKNOW = 305;

    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_DATA;
            }else {
                return NETWORK_NONET;
            }
        }else {
            return NETWORK_NONET;
        }
    }

}

现在我们来实现这个基类吧,上代码:

public class BaseActivity extends FragmentActivity implements NetworkChangeReceiver.NetEvevt{

    public static NetworkChangeReceiver.NetEvevt evevt ;
    private IntentFilter intentFilter;
    private NetworkChangeReceiver networkChangeReceiver;
    /**
     * 网络类型
     * @param savedInstanceState
     */
    private int netModel;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        evevt=this;
        intentFilter = new IntentFilter();
        intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
        networkChangeReceiver = new NetworkChangeReceiver();
        registerReceiver(networkChangeReceiver,intentFilter);
        inspectNet();

    }

    public boolean inspectNet(){
        this.netModel = NetUtil.getNetWorkState(BaseActivity.this);
        return isNetConnect();
    }

    /**
     * 判断当前网络状态
     * @return
     */
    public boolean isNetConnect(){
        if (netModel == 1){
            return true;
        }else if (netModel == 0){
            return true;
        }else if (netModel == -1){
            return false;
        }
        return false;
    }

    @Override
    public void onNetChange(int netModel) {
        Toast.makeText(BaseActivity.this, "network model:"+netModel, Toast.LENGTH_SHORT).show();
    }
}

在这个类中,可以看到在onCreat()(也可以在其他方法中加载,如:onStart(),onResume())的方法中我通过动态注册广播的方式监听网络状态,然后基类实现了NetChangeReceiver.NetEvevt接口,通过onNetChange()的方法处理监听到网络后的逻辑(当然这里只是简单的打印了个提示)。到这里,一个简单的网络监听框架就实现了,当某个活动需要进行网络监听时,只需要继承这个基类并重新监听后的逻辑就可以了,是不是很简单明了呀。

附上源码连接,不足之处忘指教.点击打开链接







你可能感兴趣的:(网络监听)