import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Handler;
import android.os.Looper;
import android.util.Log;
import java.util.ArrayList;
import java.util.List;
public class NetworkStateReceiver extends BroadcastReceiver {
private static final String TAG = "NetworkStateReceiver";
private List<NetworkConnListener> mListeners = new ArrayList<>();
private static NetworkStateReceiver mInstance;
private Context mContext;
private Handler mHandler;
public interface NetworkConnListener {
void onNetworkConnected();
void onNetworkDisconnected();
}
private NetworkStateReceiver(Context context) {
mContext = context.getApplicationContext();
Thread thread = new Thread("Network state"){
@Override
public void run() {
Looper.prepare();
mHandler = new Handler();
Looper.loop();
}
};
thread.start();
}
public static NetworkStateReceiver sharedReceiver(Context context) {
if (mInstance == null) {
mInstance = new NetworkStateReceiver(context);
}
return mInstance;
}
@Override
public void onReceive(Context context, Intent intent) {
if (ConnectivityManager.CONNECTIVITY_ACTION.equals(intent.getAction())) {
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()) {
canAccessInternet(false);
} else {
mHandler.removeCallbacksAndMessages(null);
mHandler.post(new Runnable() {
@Override
public void run() {
Runtime runtime = Runtime.getRuntime();
try {
Process p = runtime.exec("ping -c 1 www.baidu.com");
int ret = p.waitFor();
Log.i(TAG, "Process:" + ret);
if (ret == 0)
canAccessInternet(true);
else
canAccessInternet(false);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
}
}
/**
* whether can access internet.
*
* @param accessInternet can or not access internet
*/
private void canAccessInternet(boolean accessInternet) {
if (accessInternet) {
for (NetworkConnListener listener : mListeners) {
listener.onNetworkConnected();
}
} else {
for (NetworkConnListener listener : mListeners) {
listener.onNetworkDisconnected();
}
}
}
public void addListener(NetworkConnListener listener) {
if (!mListeners.contains(listener)) {
mListeners.add(listener);
}
}
public void removeListener(NetworkConnListener listener) {
mListeners.remove(listener);
}
}
Android 监听当前网络状态是否可以访问Internet
最新推荐文章于 2022-02-22 15:31:01 发布