import android.app.Application;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.ConnectivityManager;
import android.net.Network;
import android.net.NetworkInfo;
import android.net.NetworkRequest;
import android.os.Build;
import android.telephony.TelephonyManager;
/**
* @param
* @Comments : 功能
* @Author : Lampo
* @CreateDate : 2019/10/30 14:28
* @ModifiedBy : Lampo
* @ModifiedDate : 2019/10/30 14:28
* @Modified :
*/
public class CitNetWorkMonitorManager {
private static CitNetWorkMonitorManager ourInstance;
private Application application;
private final String ANDROID_NET_CHANGE_ACTION = "android.net.conn.CONNECTIVITY_CHANGE";
private ConnectivityManager connectivityManager;
private MyBroadcastReceiver receiver;
public static CitNetWorkMonitorManager getInstance() {
synchronized (CitNetWorkMonitorManager.class) {
if (ourInstance == null) {
ourInstance = new CitNetWorkMonitorManager();
}
}
return ourInstance;
}
/**
* 初始化 傳入application
*
* @param application
*/
public void init(Application application) {
if (application == null) {
throw new NullPointerException("application can not be null");
}
this.application = application;
connectivityManager = (ConnectivityManager) this.application.getSystemService(Context.CONNECTIVITY_SERVICE);
}
/**
* 初始化網絡監聽 根據不同版本做不同的處理
*/
public void register(){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {//API 大於21時
NetworkRequest.Builder builder = new NetworkRequest.Builder();
NetworkRequest request = builder.build();
connectivityManager.registerNetworkCallback(request, networkCallback);
} else {//低版本
if (receiver == null) receiver = new MyBroadcastReceiver();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
this.application.registerReceiver(receiver, intentFilter);
}
}
public void unregister(){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {//API 大於21時
connectivityManager.unregisterNetworkCallback(networkCallback);
} else {//低版本
if (receiver != null) {
this.application.unregisterReceiver(receiver);//註銷廣播
}
}
}
private ConnectivityManager.NetworkCallback networkCallback = new ConnectivityManager.NetworkCallback(){
/**
* 網絡可用的回調連接成功
*/
@Override
public void onAvailable(Network network) {
super.onAvailable(network);
postNetState();
}
/**
* 網絡不可用時調用和onAvailable成對出現
*/
@Override
public void onLost(Network network) {
super.onLost(network);
postNetState();
}
};
private class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equalsIgnoreCase(ANDROID_NET_CHANGE_ACTION)) {
postNetState();
}
}
};
private void postNetState(){
//網絡發生變化 沒有網絡-0:WIFI網絡1:4G網絡-4:3G網絡-3:2G網絡-2
int netType = getAPNType(this.application);
UtilsManager.isNetAvailable(this.application);
PDALogger.e("onNetWorkStateChange receiver>>> :" +netType);
if(netType != 0){
//當網絡打開,你要處理的事情
this.application.sendBroadcast(new Intent(Config.REQURSTTIMELOG_UPLOADDATA));
this.application.sendBroadcast(new Intent(Config.CHANGELINEUPLOADDATA));
}
}
/**
* 獲取當前的網絡狀態 :沒有網絡-0:WIFI網絡1:4G網絡-4:3G網絡-3:2G網絡-2
* 自定義
*
* @param context
* @return
*/
private int getAPNType(Context context) {
//結果返回值
int netType = 0;
//獲取手機所有連接管理對象
ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context
.CONNECTIVITY_SERVICE);
//獲取NetworkInfo對象
NetworkInfo networkInfo = manager.getActiveNetworkInfo();
//NetworkInfo對象爲空 則代表沒有網絡
if (networkInfo == null) {
return netType;
}
//否則 NetworkInfo對象不爲空 則獲取該networkInfo的類型
int nType = networkInfo.getType();
if (nType == ConnectivityManager.TYPE_WIFI) {
//WIFI
netType = 1;
} else if (nType == ConnectivityManager.TYPE_MOBILE) {
int nSubType = networkInfo.getSubtype();
TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService
(Context.TELEPHONY_SERVICE);
//3G 聯通的3G爲UMTS或HSDPA 電信的3G爲EVDO
if (nSubType == TelephonyManager.NETWORK_TYPE_LTE
&& !telephonyManager.isNetworkRoaming()) {
netType = 4;
} else if (nSubType == TelephonyManager.NETWORK_TYPE_UMTS
|| nSubType == TelephonyManager.NETWORK_TYPE_HSDPA
|| nSubType == TelephonyManager.NETWORK_TYPE_EVDO_0
&& !telephonyManager.isNetworkRoaming()) {
netType = 3;
//2G 移動和聯通的2G爲GPRS或EGDE,電信的2G爲CDMA
} else if (nSubType == TelephonyManager.NETWORK_TYPE_GPRS
|| nSubType == TelephonyManager.NETWORK_TYPE_EDGE
|| nSubType == TelephonyManager.NETWORK_TYPE_CDMA
&& !telephonyManager.isNetworkRoaming()) {
netType = 2;
} else {
netType = 2;
}
}
return netType;
}
}