Android网络状态监听

先来一个网络状态判断工具类:

public class NetworkUtil {

private NetworkUtil() {

throw new UnsupportedOperationException("u can't instantiate me...");

}

@RequiresPermission("android.permission.ACCESS_NETWORK_STATE")

private static NetworkInfo getActiveNetworkInfo(Context context) {

ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);

return cm.getActiveNetworkInfo();

}

/**

* 获取当前网络类型

    * 需添加权限 {@code }

*/

    @RequiresPermission("android.permission.ACCESS_NETWORK_STATE")

public static NetworkType getNetworkType(Context context) {

NetworkType netType = NetworkType.NETWORK_NO;

NetworkInfo info =getActiveNetworkInfo(context);

if (info !=null && info.isAvailable()) {

if (info.getType() == ConnectivityManager.TYPE_WIFI) {

netType = NetworkType.NETWORK_WIFI;

}else if (info.getType() == ConnectivityManager.TYPE_MOBILE) {

switch (info.getSubtype()) {

case TelephonyManager.NETWORK_TYPE_TD_SCDMA:

case TelephonyManager.NETWORK_TYPE_EVDO_A:

case TelephonyManager.NETWORK_TYPE_UMTS:

case TelephonyManager.NETWORK_TYPE_EVDO_0:

case TelephonyManager.NETWORK_TYPE_HSDPA:

case TelephonyManager.NETWORK_TYPE_HSUPA:

case TelephonyManager.NETWORK_TYPE_HSPA:

case TelephonyManager.NETWORK_TYPE_EVDO_B:

case TelephonyManager.NETWORK_TYPE_EHRPD:

case TelephonyManager.NETWORK_TYPE_HSPAP:

netType = NetworkType.NETWORK_3G;

break;

case TelephonyManager.NETWORK_TYPE_LTE:

case TelephonyManager.NETWORK_TYPE_IWLAN:

netType = NetworkType.NETWORK_4G;

break;

case TelephonyManager.NETWORK_TYPE_GSM:

case TelephonyManager.NETWORK_TYPE_GPRS:

case TelephonyManager.NETWORK_TYPE_CDMA:

case TelephonyManager.NETWORK_TYPE_EDGE:

case TelephonyManager.NETWORK_TYPE_1xRTT:

case TelephonyManager.NETWORK_TYPE_IDEN:

netType = NetworkType.NETWORK_2G;

break;

default:

String subtypeName = info.getSubtypeName();

if (subtypeName.equalsIgnoreCase("TD-SCDMA")

|| subtypeName.equalsIgnoreCase("WCDMA")

|| subtypeName.equalsIgnoreCase("CDMA2000")) {

netType = NetworkType.NETWORK_3G;

}else {

netType = NetworkType.NETWORK_UNKNOWN;

}

break;

}

}else {

netType = NetworkType.NETWORK_UNKNOWN;

}

}

return netType;

}

}



网络状态类型枚举类

public enum NetworkType {

NETWORK_WIFI("WiFi"),

NETWORK_4G("4G"),

NETWORK_2G("2G"),

NETWORK_3G("3G"),

NETWORK_UNKNOWN("Unknown"),

NETWORK_NO("No network");

private Stringdesc;

NetworkType(String desc) {

this.desc = desc;

}

@Override

    public String toString() {

return desc;

}

}



广播接收者,监听网络---->

public class NetStateChangeReceiverextends BroadcastReceiver {

private NetworkTypemType = NetworkUtil.getNetworkType(MyApplication.getContext());

private static class InstanceHolder{

private static final NetStateChangeReceiverINSTANCE =new NetStateChangeReceiver();

}

private ListmObservers =new ArrayList<>();

@Override

    public void onReceive(Context context, Intent intent) {

if (ConnectivityManager.CONNECTIVITY_ACTION.equals(intent.getAction())){

NetworkType networkType = NetworkUtil.getNetworkType(context);

notifyObservers(networkType);

}

}

public static void registerReceiver(Context context){

IntentFilter intentFilter =new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);

intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");

context.registerReceiver( InstanceHolder.INSTANCE,intentFilter);

}

public static void unRegisterReceiver(Context context){

context.unregisterReceiver( InstanceHolder.INSTANCE);

}

public static void registerObserver(NetStateChangeObserver observer){

if (observer ==null) {

return;

}

if (!InstanceHolder.INSTANCE.mObservers.contains(observer)){

InstanceHolder.INSTANCE.mObservers.add(observer);

}

}

public static void unRegisterObserver(NetStateChangeObserver observer){

if (observer ==null) {

return;

}

if (InstanceHolder.INSTANCE.mObservers ==null) {

return;

}

InstanceHolder.INSTANCE.mObservers.remove(observer);

}

private void notifyObservers(NetworkType networkType){

if (mType == networkType) {

return;

}

mType = networkType;

if (networkType == NetworkType.NETWORK_NO){

for (NetStateChangeObserver observer :mObservers){

observer.onNetDisconnected();

}

}else {

for (NetStateChangeObserver observer :mObservers){

observer.onNetConnected(networkType);

}

}

}

}


需要用到一个观察者,来通知网络状态更新------>

public interface NetStateChangeObserver {

void onNetDisconnected();

void onNetConnected(NetworkType networkType);

}


activity 公共基类注册广播,注册观察者


Android网络状态监听_第1张图片

你可能感兴趣的:(Android网络状态监听)