日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Android?ConnectivityManager網絡管理詳解_Android

作者:后端碼匠 ? 更新時間: 2022-12-12 編程語言

概況

ConnectivityManager主要職責,官方說明:

Monitor network connections (Wi-Fi, GPRS, UMTS, etc.)

Send broadcast intents when network connectivity changes

Attempt to “fail over” to another network when connectivity to a network is lost

Provide an API that allows applications to query the coarse-grained or fine-grained state of the available networks

Provide an API that allows applications to request and select networks for their data traffic

監控網絡連接(Wi-Fi, GPRS, UMTS, etc.);

當網絡連接改變時發送Intent;

當連接到一個網絡失敗時,嘗試用其他網絡補救;

提供API給應用查詢有效網絡粗略或者精確的狀態;

提供API給應用為它們的數據傳輸請求和選擇網絡;

ConnectivityManager類用于查詢網絡狀態,并且也能被動監聽網絡狀態的變化。

需要的權限

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

判斷是否有網絡

下面這個getActiveNetworkInfo 方法是過時的舊方法。這里記錄一下,請注意如果獲取到的是null,那么等于當前設備沒有連接網絡。注意這里是使用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
}

判斷當前網絡類型

val cm = applicationContext.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
val networks = cm.allNetworks
for (item in networks){
    val caps = cm.getNetworkCapabilities(item)
    if (caps.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)){
        Log.e("ytzn", "item wifi 網絡")

    } else if (caps.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)){
        Log.e("ytzn", "item wifi 移動網絡")
    }
}

監聽網絡狀態

如果你的需求只是關注是否有網絡,你只需要關心 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;

原文鏈接:https://codingce.blog.csdn.net/article/details/127419863

欄目分類
最近更新