网络工具,通过该类可以直接监听网络状态改变
2017-08-14 13:47
399 查看
package com.bearbaby.erp.staff.util; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.widget.Toast; import com.bearbaby.erp.staff.MyApplication; import java.util.ArrayList; import java.util.List; /** * Created by Administrator on 2017/4/19. */ public class NetUtils { private static boolean netStateLink = true; private static boolean registered = false;//防止重复注册 private static boolean showToasted = false; //防止application和启动页面重复初始化后,没网络提示语的重复 private static Context context; private static NetUtils instance; private static ConnectionChangeReceiver myNetReceiver; private static final String TAG = "NetUtils"; private NetUtils() { } public static synchronized NetUtils getInstance() { //对获取实例的方法进行同步 if (instance == null) instance = new NetUtils(); return instance; } //获得是否有网络连接 public static boolean isnetStateLink() { LogUtil.i(TAG, "isnetStateLink:是否有网络?"+netStateLink); return netStateLink; } /** * 这个一定要调用一次 * 否则应用无法联网一定要在网络请求之前调用 *启动页面初始化就好 为了安全起见,application一定要调用,startup也要调用, * 因为用户返回键退出后,不会再走application的创建,(应用退出,但是不杀死进程不会走application的) * @param contexts 一定要是Context,不能是Activity的this */ public static void init(Context contexts) { if (contexts != null) { context = contexts; ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo mobNetInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE); NetworkInfo wifiNetInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI); if (!mobNetInfo.isConnected() && !wifiNetInfo.isConnected()) { netStateLink = false; if (!showToasted){ Toast.makeText(context,"联网失败,请检查网络设置",Toast.LENGTH_SHORT) .show(); showToasted=true; } LogUtil.i(TAG, "isnetStateLink: 初始化网络状态没有网络连接........."); } else { LogUtil.i(TAG, "isnetStateLink: 初始化网络状态有网络连接........."); netStateLink = true; } if (!registered){ registerReceiver();//注册....... } } } /** * 注册网络监听 */ private static void registerReceiver() { LogUtil.i(TAG, " 注册网络监听registerReceiver........."); IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION); myNetReceiver = new ConnectionChangeReceiver(); context.registerReceiver(myNetReceiver, filter); registered=true; } /** * 取消网络注册监听 * 需要在应用最后一个页面销毁后注销(MainActivity退出后一定要调用), * 不然提示第一次进入后的联网失败,请检查网络设置,会重复 */ public static void unregisterReceiver() { LogUtil.i(TAG, " 反注册网络监听unregisterReceiver........."); if (registered){ try { if (context!=null){ context.unregisterReceiver(myNetReceiver); LogUtil.i(TAG, " 成功反注册网络监听........."); registered=false; } } catch (Exception e) { e.printStackTrace(); LogUtil.e(TAG, "异常反注册网络监听........."+e.getMessage()); registered=false; } registered=false; } showToasted=false; } static List<NetworkState> ln = new ArrayList(); //网络状态监听 static class ConnectionChangeReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo mobNetInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE); NetworkInfo wifiNetInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI); if (!mobNetInfo.isConnected() && !wifiNetInfo.isConnected()) { if (netStateLink) { if ( MyApplication.getContext().isAppVisible()) { ToastUtil.show("网络已断开!"); for (NetworkState ns : ln) { if (ns != null) { ns.disconnectNetwork(); } } } } netStateLink = false; } else { if (!netStateLink){ if ( MyApplication.getContext().isAppVisible()) { ToastUtil.show("网络已恢复!"); //通知监听,如果不在前台不通知,防止有网络后,做其他网络操作退出回到登录页面 netStateLink = true;//这个必须要在回调前修改为true 因为接口后面可能会有网络操作,到时候任然无法请求 for (NetworkState ns : ln) { if (ns != null) { ns.connectedNetwork(); } } } } netStateLink = true; } } } //添加网络监听和removeNetworkListen搭配 public void addNetworkListen(NetworkState ns) { if (ns != null) { ln.add(ns); } } //网络状态监听回调接口 public interface NetworkState { //连接上网络 void connectedNetwork(); //断开网络 void disconnectNetwork(); } //移除网络监听,和addNetworkListen搭配使用 public synchronized void en(NetworkState ns) { if (ns != null) { for (int i = 0; i < ln.size(); i++) { if (ln.get(i) == ns) { ln.remove(i); } } } } }
相关文章推荐
- 网络工具,通过该类可以直接监听网络状态改变
- Android通过使用系统广播监听网络状态的改变
- wget是一个从网络上自动下载文件的自由工具,支持通过HTTP、HTTPS、FTP三个最常见的TCP/IP协议下载,并可以使用HTTP代理
- android之通过phoneStateListener监听电话状态改变
- Android网络连接状态查询及事件监听工具
- 通过广播进行网络状态监听
- 网络判断网络连接有多种办法,通过C#程序也可以判断与远程主机的连接状态。具体实现方法
- android 监听网络连接状态的改变
- Andriod开发 网络状态改变监听(这样说可能不太合理)
- Android 通过注册广播,实时监听网络连接与断开状态的变化
- android 监听网络连接状态的改变
- Android 超简单音乐播放器(十三)监听网络状态的变化,设置移动网络是否可以播放。
- android 通过Service和Receiver来监听网络状态
- 监听Package的安装和卸载、电源的连接和断开、网络状态改变广播、解锁广播、屏幕变亮变按广播
- Android编程监听网络连接状态改变的方法
- android网络监听状态改变收到2个广播处理
- js中不适用工具可以直接通过ID名称找到唯一的对象
- 安卓监听网络状态改变
- 关于网络状态改变监听广播的使用(android不同系统版本会有不同)