目录

  • ​​常规网络状态检测​​
  • ​​两种方式通过广播监听网络状态变化​​
  • ​​方式一、广播+普通回调​​
  • ​​方式二、广播+LiveData​​

常规网络状态检测

  • 判断手机是否连接网络
  • 判断设备是否wifi连接
  • 判断设备是否数据连接
  • 判断是否以太网连接
  • 获取设备ip
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;

import cc.catface.ctool.context.TContext;

public class TNetwork {

/** 判断手机是否连接网络 */
public static boolean isNetAvail() {
ConnectivityManager manager = (ConnectivityManager) TContext.getContext().getSystemService(Context.CONNECTIVITY_SERVICE);
if (null == manager) return false;
NetworkInfo info = manager.getActiveNetworkInfo();
return null != info && info.isAvailable();
}

/* 判断设备是否wifi连接 */
public static boolean isWIFI() {
ConnectivityManager manager = (ConnectivityManager) TContext.getContext().getSystemService(Context.CONNECTIVITY_SERVICE);
if (null == manager) return false;
NetworkInfo networkInfo = manager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
return null != networkInfo && networkInfo.isConnected();
}

/* 判断设备是否数据连接 */
public static boolean isMobile() {
ConnectivityManager manager = (ConnectivityManager) TContext.getContext().getSystemService(Context.CONNECTIVITY_SERVICE);
if (null == manager) return false;
NetworkInfo networkInfo = manager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE_DUN);
return null != networkInfo && networkInfo.isConnected();
}

/* 判断是否以太网连接 */
public static boolean isEthernet() {
ConnectivityManager manager = (ConnectivityManager) TContext.getContext().getSystemService(Context.CONNECTIVITY_SERVICE);
if (null == manager) return false;
NetworkInfo networkInfo = manager.getNetworkInfo(ConnectivityManager.TYPE_ETHERNET);
return null != networkInfo && networkInfo.isConnected();
}


/** ip */
public static String getIp() {
WifiManager wifiManager = (WifiManager) TContext.getContext().getApplicationContext().getSystemService(Context.WIFI_SERVICE);
if (null == wifiManager) return "";
WifiInfo connectionInfo = wifiManager.getConnectionInfo();
return convertIp(connectionInfo.getIpAddress());
}

private static String convertIp(int ip) {
return (ip & 0xff) + "." + ((ip >> 8) & 0xff) + "." + ((ip >> 16) & 0xff) + "." + ((ip >> 24) & 0xff);
}
}

两种方式通过广播监听网络状态变化

建议使用方式二,简单好用

方式一、广播+普通回调

  • 网络广播
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;

public class NetBroadcastReceiver extends BroadcastReceiver {
private NetEventListener mListener;

@Override public void onReceive(Context context, Intent intent) {
if (null == intent || null == intent.getAction()) {
mListener.onNetChange(NetStateUtil.NETWORK_NONE);
return;
}

if (intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
int netWorkType = NetStateUtil.getNetWorkType();
mListener.onNetChange(netWorkType);
}
}

public interface NetEventListener {
void onNetChange(int netWorkType);
}

public void setListener(NetEventListener listener) {
if (null != listener) this.mListener = listener;
}
}
  • 辅助工具类
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;

import cc.catface.ctool.context.TContext;

public class NetStateUtil {
public static final int NETWORK_NONE = -1; // 无网络
public static final int NETWORK_MOBILE = 0; // 移动网络
public static final int NETWORK_WIFI = 1; // 无线网络

public static int getNetWorkType() {
int result = NETWORK_NONE;

ConnectivityManager manager = (ConnectivityManager) TContext.getContext().getSystemService(Context.CONNECTIVITY_SERVICE);
if (null == manager) return NETWORK_NONE;
NetworkInfo activeNetworkInfo = manager.getActiveNetworkInfo();
if (null == activeNetworkInfo || !activeNetworkInfo.isConnected()) return result;
if (activeNetworkInfo.getType() == (ConnectivityManager.TYPE_WIFI)) result = NETWORK_WIFI;
if (activeNetworkInfo.getType() == (ConnectivityManager.TYPE_MOBILE))
result = NETWORK_MOBILE;

return result;
}
}
``
  • 使用方式
// 初始化广播并通过回调获得网络状态变化的结果
mReceiver = new NetBroadcastReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
mActivity.registerReceiver(mReceiver, filter);
mReceiver.setListener(netWorkType -> {
String netState = "无网络连接";
if (NetStateUtil.NETWORK_WIFI == netWorkType) {
netState = "wifi";
} else if (NetStateUtil.NETWORK_MOBILE == netWorkType) {
netState = "移动网络";
}
mBinding.tiNetState.setContent("当前网络状态:" + netState);
});
// 反注册广播
@Override public void onDestroy() {
super.onDestroy();
if (null != mReceiver) mActivity.unregisterReceiver(mReceiver);
}

方式二、广播+LiveData

  • 自定义LiveData,通过内部的广播结果设置当前LiveData的值
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 androidx.lifecycle.LiveData;

import java.lang.ref.WeakReference;

public class NetworkLiveData extends LiveData<NetworkInfo> {


private final WeakReference<Context> mWeakContext;
private static NetworkLiveData mNetworkLiveData;
private NetworkReceiver mReceiver;
private final IntentFilter mFilter;


private NetworkLiveData(WeakReference<Context> context) {
mWeakContext = context;
mReceiver = new NetworkReceiver();
mFilter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
}

public static NetworkLiveData getInstance(WeakReference<Context> context) {
if (null == mNetworkLiveData) {
synchronized (NetworkLiveData.class) {
if (null == mNetworkLiveData) {
mNetworkLiveData = new NetworkLiveData(context);
}
}
}

return mNetworkLiveData;
}


@Override protected void onActive() {
super.onActive();
mWeakContext.get().registerReceiver(mReceiver, mFilter);
}

@Override protected void onInactive() {
super.onInactive();
mWeakContext.get().unregisterReceiver(mReceiver);
}


private static class NetworkReceiver extends BroadcastReceiver {
@Override public void onReceive(Context context, Intent intent) {
ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
if (null == manager) return;
NetworkInfo info = manager.getActiveNetworkInfo();
getInstance(new WeakReference<>(context)).setValue(info);
}
}
}
  • 使用方式
NetworkLiveData.getInstance(new WeakReference<>(mActivity)).observe(mActivity, new Observer<NetworkInfo>() {
@Override public void onChanged(NetworkInfo networkInfo) {
TLog.d(getClass().getName() + "-->networkInfo: " + networkInfo);
}
});