Android開發 ConnectivityManager


前言

  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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM