package com.aiyou.utils;
import com.aiyou.utils.http.ConcurrentHashSet;
import com.aiyou.utils.logcat.Logcat;
import android.annotation.SuppressLint;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
/**
* @author sollian
*/
public class NetWorkManager {
private static final String TAG = NetWorkManager.class.getSimpleName();
public static final String MSG_NONET = "网络连接失败";
private static NetWorkManager mInstance;
private Context mContext;
/**
* 网络链接状态
*/
public enum NetStatus {
// 未定义
NOTHING,
// 无网络链接
NONE,
// wifi链接
NETTYPE_WIFI,
// wap链接
NETTYPE_CMWAP,
// net链接
NETTYPE_CMNET,
}
private NetStatus NETWORKSTATUS = NetStatus.NOTHING;
public interface NetStatsChangeListener {
void onNetStatsChange();
}
private ConcurrentHashSet<NetStatsChangeListener> mListenerSet = new ConcurrentHashSet<>();
private BroadcastReceiver mConnectionReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
setNetworkType();
for (NetStatsChangeListener listener : mListenerSet) {
listener.onNetStatsChange();
}
}
};
private NetWorkManager(Context context) {
mContext = context;
updateNetworkType(mContext);
/**
* 注册网络连接状态监听器
*/
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
mContext.registerReceiver(mConnectionReceiver, intentFilter);
}
public static NetWorkManager getInstance(Context context) {
if (mInstance == null) {
synchronized (NetWorkManager.class) {
if (mInstance == null) {
mInstance = new NetWorkManager(context);
}
}
}
return mInstance;
}
public void registerNetStatsChangeListener(NetStatsChangeListener listener) {
mListenerSet.add(listener);
}
public void unregisterNetStatsChangeListener(NetStatsChangeListener listener) {
if (mListenerSet.contains(listener)) {
mListenerSet.remove(listener);
}
}
/**
* 程序退出时调用
*/
public void recycle() {
try {
mContext.unregisterReceiver(mConnectionReceiver);
} catch (Exception e) {
Logcat.e(TAG, "recycle:" + e.getMessage());
}
mInstance = null;
}
public boolean isNetAvailable() {
return getNetworkType() != NetStatus.NOTHING;
}
/**
* 获取当前网络类型
*
* @return
*/
public NetStatus getNetworkType() {
return getNetworkType(mContext);
}
/**
* 获取当前网络类型
*
* @return
*/
public NetStatus getNetworkType(Context context) {
if (NETWORKSTATUS == NetStatus.NOTHING) {
NETWORKSTATUS = updateNetworkType(context);
}
return NETWORKSTATUS;
}
/**
* 设置网络类型
*
*/
public void setNetworkType() {
NETWORKSTATUS = updateNetworkType(mContext);
}
/**
* 更新当前网络类型
*/
@SuppressLint("DefaultLocale")
private NetStatus updateNetworkType(Context context) {
NetStatus netType = NetStatus.NOTHING;
ConnectivityManager connectivityManager = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
if (networkInfo == null) {
return netType;
}
int nType = networkInfo.getType();
if (nType == ConnectivityManager.TYPE_MOBILE) {
String extraInfo = networkInfo.getExtraInfo();
if (null != extraInfo && extraInfo.toLowerCase().contains("net")) {
netType = NetStatus.NETTYPE_CMNET;
} else {
netType = NetStatus.NETTYPE_CMWAP;
}
} else if (nType == ConnectivityManager.TYPE_WIFI) {
netType = NetStatus.NETTYPE_WIFI;
}
return netType;
}
}