1. 程式人生 > >Android 監聽網路連線狀態

Android 監聽網路連線狀態

Android手機在網路狀態發生改變的時候回傳送一條廣播。通過日誌列印,可以看到該條廣播的Action為:android.net.conn.CONNECTIVITY_CHANGE,但是在網路斷開和連線的時候或者由WIFI轉為行動網路的時候傳送的廣播的Action同為上述的Action,那麼我們如何知道當前是網路連線還是斷開呢?接下來我們就會用到ConnectivityManager這個類,ConnectivityManager可以通過獲取系統Service獲得:

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

通過connectivityManager又可以獲得WIFI網路或者行動網路的連線狀態

NetworkInfo mobileInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
NetworkInfo wifiInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);

因此,我們可以自定義一個BroadcastReceiver,監聽到網路狀態後通過介面將該狀態對外暴露出去

public class NetBroadcastReceiver extends BroadcastReceiver {

    private NetConnectedListener netConnectedListener;
    
    @Override
    public void onReceive(Context context, Intent intent) {
    
        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()) {
            //WIFI和行動網路均未連線
            netContentListener.netContent(false);
           
        } else {
            //WIFI連線或者行動網路連線
            netContentListener.netContent(true);
        }

    }

    public void setNetConnectedListener(NetConnectedListener netConnectedListener) {
        this.netConnectedListener = netConnectedListener;
    }

    public interface NetConnectedListener {
        void netContent(boolean isConnected);
    }

}

然後在需要監聽此狀態的Activity中動態註冊該BroadcastReceiver即可

NetBroadcastReceiver receiver = new NetBroadcastReceiver();

IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
        this.registerReceiver(receiver, filter);
        
receiver.setNetContentListener(new NetBroadcastReceiver.NetContentListener() {
            @Override
            public void netContent(boolean isConnected) {
               		 //在此處處理具體業務即可
            }
        });