Androidのネットワーク状態判断(wifiとモバイルネットワークデータ)

9000 ワード

ネットワークの状態の変化を傍受してユーザーのネットワーク状況をタイムリーに注意する必要がある場合があります.そのため、私たちは多くのネットワークの変化を傍受しなければなりません.くだらないことは言わないで、ネットワークの様々な状況をコードにリストして、必要なものは実際の状況によってヒントを与えることができます.1.まず、ブロードキャストの傍受が必要であり、ネットワーク状態の変化によってブロードキャストがトリガーされる.
//    
<receiver
    android:name=".receiver.StartServiceReceiver"
    android:exported="true">
    <intent-filter>
        <action android:name="android.net.wifi.WIFI_STATE_CHANGED" />//  wifi      
        <action android:name="android.net.wifi.STATE_CHANGE" />//  wifi     
    </intent-filter>
</receiver>

//    ,              
IntentFilter filter = new IntentFilter();
filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);//     (  wifi     )

以上がブロードキャストの登録であり、wifiの傍受には2種類のブロードキャストがあり、いずれも静的登録をサポートしているが、ネットワーク全体の傍受(wifi+モバイルネットワークデータ)には動的登録しかできない.
2.放送の受信と分析:
public class StartServiceReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        //   wifi      , wifi     
        if (WifiManager.WIFI_STATE_CHANGED_ACTION.equals(intent.getAction())) {
            int wifiState = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, 0);
            if (wifiState == WifiManager.WIFI_STATE_DISABLED) {//wifi  
                MlogUtil.d("netstatus", "wifi   ");
            } else if (wifiState == WifiManager.WIFI_STATE_ENABLED) {//wifi  
                MlogUtil.d("netstatus", "wifi   ");
            } else if (wifiState == WifiManager.WIFI_STATE_ENABLING) {//wifi   
                MlogUtil.d("netstatus", "wifi   ");
            } else if (wifiState == WifiManager.WIFI_STATE_DISABLING) {//wifi   
                MlogUtil.d("netstatus", "wifi   ");
            }
        }
        //   wifi                   
        if (WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(intent.getAction())) {
            Parcelable parcelableExtra = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
            if (parcelableExtra != null) {
                MlogUtil.d("netstatus", "wifi parcelableExtra   ");
                NetworkInfo networkInfo = (NetworkInfo) parcelableExtra;
                if (networkInfo.getState() == NetworkInfo.State.CONNECTED) {//     
                    MlogUtil.d("netstatus", "wifi      ");
                    if (networkInfo.isAvailable()) {//      
                        MlogUtil.d("netstatus", "wifi      ,    ");
                    } else {//       
                        MlogUtil.d("netstatus", "wifi      ,    ");
                    }
                } else {//     
                    MlogUtil.d("netstatus", "wifi      ");
                }
            } else {
                MlogUtil.d("netstatus", "wifi parcelableExtra  ");
            }
        }
        //       ,     ,   wifi        
        if (ConnectivityManager.CONNECTIVITY_ACTION.equals(intent.getAction())) {
            NetworkInfo networkInfo = intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);
            //         :wifi      
            if (networkInfo.getType() == ConnectivityManager.TYPE_WIFI) {
                MlogUtil.d("netstatus", "        wifi  ");
            } else if (networkInfo.getType() == ConnectivityManager.TYPE_MOBILE) {
                MlogUtil.d("netstatus", "            ");
            }
            //        
            checkNetworkStatus(networkInfo);
        }
    }

    private void checkNetworkStatus(NetworkInfo networkInfo) {
        if (networkInfo != null) {
            MlogUtil.d("netstatus", "    info  ");
            if (networkInfo.getState() == NetworkInfo.State.CONNECTED) {//     
                MlogUtil.d("netstatus", "         ");
                if (networkInfo.isAvailable()) {//      
                    MlogUtil.d("netstatus", "         ,    ");
                } else {//       
                    MlogUtil.d("netstatus", "         ,    ");
                }
            } else if (networkInfo.getState() == NetworkInfo.State.DISCONNECTED) {//     
                MlogUtil.d("netstatus", "         ");
            }
        } else {
            MlogUtil.d("netstatus", "    info  ");
        }
    }
}

以上のように、log印刷は、総ネットワークとwifiネットワークを区別し、上位2つはwifiネットワーク専用の傍受であり、3つ目はネットワーク全体の傍受であるため、区別のためにネットワーク全体の傍受を未総ネットワークと呼ぶ.だから、ネットワークの判断を行うには、最後の総ネットワークで判断することができ、様々な状況が注釈されているので、必要な場合は自分の状況に応じて注意することができます.