最近工作事情比较少,时间充裕,就自己研究下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();
}
}
附上源码连接,不足之处忘指教.点击打开链接