前言
ConnectivityManager類用於查詢網絡狀態,並且也能被動監聽網絡狀態的變化。
判斷是否有網絡
下面這個getActiveNetworkInfo 方法是過時的舊方法。這里記錄一下,請注意如果獲取到的是null,那么等於當前設備沒有連接網絡。注意這里是使用kotlin代碼調用的(個人最近在切換到kotlin)
private fun hasNetwork(): Boolean { val connectivity = getSystemService(CONNECTIVITY_SERVICE) as ConnectivityManager val networkInfo = connectivity.activeNetworkInfo return networkInfo != null && networkInfo.isAvailable //networkInfo如果是null也是沒有網絡 }
新方法請使用getActiveNetwork,,同上如果獲取到的是null,那么等於當前設備沒有連接網絡
private fun hasNetwork2(): Boolean { var connectivityManager: ConnectivityManager = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) { val network = connectivityManager.activeNetwork return network != null //如果是null代表沒有網絡 } return false }
監聽網絡狀態
如果你的需求只是關注是否有網絡,你只需要關心 onAvailable回調(有網絡時回調) 與 onLost回調(無網絡時回調)
private void networkListener() { ConnectivityManager connectivity = (ConnectivityManager) getContext().getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE); NetworkRequest.Builder builder = new NetworkRequest.Builder(); NetworkRequest request = builder.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) .addTransportType(NetworkCapabilities.TRANSPORT_WIFI) //表示此網絡使用Wi-Fi傳輸 .addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)//表示此網絡使用蜂窩傳輸 .build(); connectivity.registerNetworkCallback(request, new ConnectivityManager.NetworkCallback() { @Override public void onAvailable(Network network) { super.onAvailable(network); //網絡可用 ToastUtils.showShortToast("網絡可用"); Log.e("調試_臨時_log", "this_onAvailable"); } @Override public void onUnavailable() { super.onUnavailable(); //如果在指定的超時時間內未找到網絡,則調用 Log.e("調試_臨時_log", "this_onUnavailable"); } @Override public void onLost(@NonNull Network network) { super.onLost(network); //當框架的網絡嚴重中斷或正常故障結束時調用 Log.e("調試_臨時_log", "this_onLost"); } @Override public void onBlockedStatusChanged(@NonNull Network network, boolean blocked) { super.onBlockedStatusChanged(network, blocked); //當對指定網絡的訪問被阻止或取消阻止時調用 Log.e("調試_臨時_log", "this_onBlockedStatusChanged"); } @Override public void onCapabilitiesChanged(@NonNull Network network, @NonNull NetworkCapabilities networkCapabilities) { super.onCapabilitiesChanged(network, networkCapabilities); //當網絡連接到此請求的框架*更改功能但仍滿足規定的需求時調用。 boolean isInternet = networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);//獲取是否能連接Internet網 Log.e("調試_臨時_log", "this_onCapabilitiesChanged : isInternet = " + isInternet); } @Override public void onLosing(@NonNull Network network, int maxMsToLive) { super.onLosing(network, maxMsToLive); //當網絡即將斷開時調用。通常與新替換網絡的呼叫配對, //以實現優雅的切換。如果我們有嚴重損失*(損失而沒有警告),則可能無法調用此方法。 Log.e("調試_臨時_log", "this_onLosing"); } @Override public void onLinkPropertiesChanged(@NonNull Network network, @NonNull LinkProperties linkProperties) { super.onLinkPropertiesChanged(network, linkProperties); //當與該請求連接的框架網絡更改時調用。 Log.e("調試_臨時_log", "this_onLinkPropertiesChanged"); } }); }
另外你可以在配置的時候addTransportType指定監聽某個網絡狀態比如WiFi或者移動網絡,NetworkCapabilities類里還有更多類型:
/** * 表示此網絡使用移動蜂窩傳輸。 */ public static final int TRANSPORT_CELLULAR = 0; /** *表示此網絡使用Wi-Fi傳輸。 */ public static final int TRANSPORT_WIFI = 1; /** * 表示此網絡使用藍牙傳輸 */ public static final int TRANSPORT_BLUETOOTH = 2; /** * 表示此網絡使用以太網傳輸。 */ public static final int TRANSPORT_ETHERNET = 3; /** * 指示此網絡使用VPN傳輸。 */ public static final int TRANSPORT_VPN = 4; /** * 表示此網絡使用支持 Wi-Fi Aware 的傳輸。 */ public static final int TRANSPORT_WIFI_AWARE = 5; /** * 表示此網絡使用低功耗傳輸。 */ public static final int TRANSPORT_LOWPAN = 6;
End
