Android 监听当前网络状态是否可以访问Internet

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);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值