实现Android网络状态变化监听
来源:互联网 发布:网络推广学什么 编辑:程序博客网 时间:2024/06/07 06:47
网络状态变化监听在项目实践中常常使用到,而且可能贯穿整个项目。下面我们来介绍下它的实现方法。
它的实现原理很简单,首先注册一个BroadcastReceiver,接收到ConnectivityManager.CONNECTIVITY_ACTION事件,再获取一下当前的网络状态,即可完成监听。
普通写法:
在需要监听的类里定义一个内部类,继承BroadcastReceiver:
public class NetChangeBroadCastReciver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (ConnectivityManager.CONNECTIVITY_ACTION.equals(intent.getAction())) { NetworkStatus status =NetUtil.getNetWorkState(context); //TODO 1 这里可以根据得到的网络状态进行业务处理 } }}
getNetWorkState方法定义在一个工具类里:
public class NetUtil { public static NetworkStatus getNetWorkState(Context context) { ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo(); if (networkInfo != null && networkInfo.isConnected()) { if (networkInfo.getType() == (ConnectivityManager.TYPE_WIFI)) { return NetworkStatus.NETWORK_WIFI; } else if (networkInfo.getType() == (ConnectivityManager.TYPE_MOBILE)) { return NetworkStatus.NETWORK_MOBILE; } } return NetworkStatus.NETWORK_NONE; }}NetworkStatus是一个枚举类型,定义几种网络状态:
public enum NetworkStatus { NETWORK_NONE, NETWORK_MOBILE, NETWORK_WIFI}在Activity,Fragment或其他地方注册这个BroadcastReceiver:
netChangeReciver = new NetChangeBroadCastReciver(); IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION); application.registerReceiver(netChangeReciver, intentFilter);这样我们已经完成了对网络状态的监听,但每次都需要在监听的地方定义一个BroadcastReceiver并注册,是不是很麻烦?代码也显得很臃肿。可以将这些代码移到BaseActivity,BaseFragment中,并定义一个空方法,在上面的TODO 1处使用,而需要监听的Activity与Fragment则继承该方法,做相应处理,这就是多态。
然而即使这样,也还不是很简洁,下面介绍一种进阶写法。
进阶写法:
如果项目多处需要监听网络状态,可以考虑在Application处注册BroadcastReceiver,为了方面管理,定义一个单例NetStatusWatch,将注册方法添加到这个类里。
BroadcastReceiver类里,添加一个接口:
public interface OnNetChangedListener { void onNetChanged(NetworkStatus currNetStatus); }
这个接口在NetStatusWatch里注册,一旦接收到ConnectivityManager.CONNECTIVITY_ACTION,BroadcastReceiver就通过onNetChanged方法回调给NetStatusWatch。
NetStatusWatch中也定义了一个接口:
public interface OnNetStatusChangedListener { void onNetStatusChanged(NetworkStatus currNetStatus); }在需要监听网络的的地方注册这个接口,而NetStatusWatch保存了所有已注册的接口在一个List中,一旦onNetChanged回调回来网络状态,NetStatusWatch就回调网络状态给所以已注册的类。
public void regisiterListener(OnNetStatusChangedListener listener) { if (listener == null || arrNetStatusListenr.contains(listener)) { return; } arrNetStatusListenr.add(listener); } public void unRegisiterListener(OnNetStatusChangedListener listener) { if (listener == null) { return; } for (OnNetStatusChangedListener o : arrNetStatusListenr) { if (o.equals(listener)) { arrNetStatusListenr.remove(listener); break; } } }调用的类结束使用的时候需要反注册,以释放内存。
这样在需要监听网络的地方只要regisiterListener、unRegisiterListener即可到处使用。
其他写法:
可能觉得定义接口也不够简洁,如果项目用到了EventBus、otto、RxBus的,可以考虑用它们直接发送接收网络变化的消息。
源码请点击这里,查找有关网络监听的部分。
0 0
- 实现Android网络状态变化监听
- Android监听网络状态变化
- Android:检测网络状态&监听网络变化
- Android:检测网络状态&监听网络变化
- Android监听网络连接状态变化
- android接收广播监听网络状态变化
- android 监听网络连接状态的变化
- 简单 android 广播监听网络状态变化
- 笔记 android 监听网络状态变化-------广播
- android 使用广播监听网络状态变化
- Android 监听网络状态的变化
- android 监听网络状态的变化+Observer
- 监听网络状态变化
- Android:检测网络状态&监听网络变化探究
- 监听手机网络状态变化
- 手机网络状态变化监听
- Android监听网络变化
- Android 监听网络变化
- Scrapy爬虫入门教程八 交互式 shell 方便调试
- lightoj 1094
- libevent源码深度剖析四
- 一入js 深似海,从此 正则 是路人(高级——反向引用, 预搜索)
- oracle导出function,procedure
- 实现Android网络状态变化监听
- Pycharm快捷键及一些常用设置
- 扯犊子的CPI
- Matlab之repmat和reshape函数
- Appium(7)appium server日志分析
- 删除svn check out的文件
- CF 776E 欧拉函数
- 使用webpack的动态模块功能实现类似包扫描来简化配置
- Altium Designer 10中pin properties选项卡里Electrical Type各选项的意思