最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android獲取網(wǎng)絡(luò)連接狀態(tài)新方法整理

 更新時間:2023年11月22日 15:29:21   作者:broadview_java  
這篇文章主要給大家介紹了關(guān)于Android獲取網(wǎng)絡(luò)連接狀態(tài)新方法的相關(guān)資料,在開發(fā)安卓移動端時幾乎每一個app都需要連接網(wǎng)絡(luò),因此對設(shè)備的網(wǎng)絡(luò)狀態(tài)檢測是很有必要的,需要的朋友可以參考下

一. 問題背景

Android12上,有的app模塊判斷當前網(wǎng)絡(luò)的類型和連接狀態(tài)時,還是使用的舊的API,導(dǎo)致返回的結(jié)果不準確,影響代碼邏輯判斷,本篇文章就這一問題,整理一下判斷網(wǎng)絡(luò)類型和連接狀態(tài)的新方法。

二. 原因分析

在Android 10以前的版本,大家都是通過NetworkInfo.java 的getType()方法獲取網(wǎng)絡(luò)類型,通過isConnected()方法來判斷是否連接上, 判斷網(wǎng)絡(luò)連接的舊方法如下:

1.是否連接:

 2. 網(wǎng)絡(luò)類型

 但是在Android10之后,這些方法已過時,官方不推薦使用,我們先來看下官方的源碼說明

 左邊是Android10,右邊是Android9的源碼 ,   在10上已經(jīng)標記Deprecated,新加的注釋也推薦了使用的API。

還有一個舊廣播String CONNECTIVITY_ACTION = "android.net.conn.CONNECTIVITY_CHANGE"  在Android 9之后也廢棄,不推薦使用,之前的使用方法:

看下官方說明:

 官方標記Deprecated,是避免在高版本的設(shè)備上獲取返回的網(wǎng)絡(luò)狀態(tài)不對,并且給了推薦的API,以Android10為一個分界點, 之后的版本都推薦使用新的API方法。

三. 官方推薦API

官方推薦:監(jiān)控 Android 中的互聯(lián)網(wǎng)連接,可以使用ConnectivityManager類,這是一個允許您查詢網(wǎng)絡(luò)狀態(tài)的系統(tǒng)服務(wù)類,   還有一個NetworkCapabilities類,代表活動網(wǎng)絡(luò)的功能。

體使用方法如下:

  • registerNetworkCallback():此函數(shù)注冊一個NetworkCallback對象來監(jiān)聽網(wǎng)絡(luò)狀態(tài)變化。它以一個NetworkCallback對象作為參數(shù)。
  • unregisterNetworkCallback():此函數(shù)取消注冊以前注冊的NetworkCallback對象。

接下來重點關(guān)注NetworkCallback中的回調(diào)方法描述

回調(diào)方法

描述

onCapabilitiesChanged

當網(wǎng)絡(luò)狀態(tài)改變時回調(diào),比如信號強度切換,或者連接上網(wǎng)絡(luò)—>斷開網(wǎng)絡(luò),或者 mobile網(wǎng)絡(luò)切換到Wifi網(wǎng)絡(luò),都會回調(diào)

onAvailable

網(wǎng)絡(luò)連接成功 但不能判斷該網(wǎng)絡(luò)是否可以正常上網(wǎng)

onUnavailable

當網(wǎng)絡(luò)連接超時或網(wǎng)絡(luò)請求達不到可用要求時調(diào)用

onBlockedStatusChanged

當訪問指定的網(wǎng)絡(luò)被阻止或解除阻塞時調(diào)用

onLosing

當網(wǎng)絡(luò)正在斷開連接時調(diào)用

onLost

當網(wǎng)絡(luò)已斷開連接時調(diào)用

onLinkPropertiesChanged

當網(wǎng)絡(luò)連接的屬性被修改時調(diào)用

接下來再說一下

NetworkCapabilities.java類中的NET_CAPABILITY_VALIDATED字段,描述為:

表示此網(wǎng)絡(luò)上的連接已成功驗證。例如,對于具有NET_CAPABILITY_INTERNET的網(wǎng)絡(luò),這意味著已成功檢測到INTERNET連接。

通過實際log來描述說明一下:

1. 連接上可上網(wǎng)的wifi,可看到VALIDATED的標記:

2. 連接上需要認證和不能上網(wǎng)的wifi,找不到VALIDATED標記:

 3. 用數(shù)據(jù)流量上網(wǎng),可以看到VALIDATED的標記:

我們可以通過networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)這個方法作為(連接可以正常上網(wǎng)的網(wǎng)絡(luò))判斷條件。進一步通過networkCapabilities.hasTransport方法來判斷當前的網(wǎng)絡(luò)類型。

四. 使用方法

看代碼更直接一點:

MainActivity.java

@SuppressLint("NewApi")
public class MainActivity extends AppCompatActivity {
 
    private static final String TAG = "ConnectManager";
 
    private ConnectivityManager networkService;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        networkService = (ConnectivityManager) this.getSystemService(Context.CONNECTIVITY_SERVICE);
        if (networkService != null) {
            //注冊 NetworkCallBack
            networkService.registerDefaultNetworkCallback(networkCallBack);
        }
    }
 
 
    /*
    * 測試網(wǎng)絡(luò)工具類方法
    * */
    @Override
    protected void onResume() {
        super.onResume();
        //Log.e(TAG,  "=====在onResume方法中判斷 : isMobileNetwork :" + NetworkUtils.isMobileNetwork(this));
        //Log.e(TAG,  "=====在onResume方法中判斷 : isWifiNetwork :" + NetworkUtils.isWifiNetwork(this));
        //Log.e(TAG,  "=====在onResume方法中判斷 : getConnectedNetworkType :" + NetworkUtils.getConnectedNetworkType(this));
    }
 
    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (networkService != null && networkCallBack != null) {
            networkService.unregisterNetworkCallback(networkCallBack);
        }
    }
 
    private final ConnectivityManager.NetworkCallback networkCallBack = new ConnectivityManager.NetworkCallback(){
        //當網(wǎng)絡(luò)狀態(tài)修改但仍舊是可用狀態(tài)時調(diào)用
        @Override
        public void onCapabilitiesChanged(@NonNull Network network, @NonNull NetworkCapabilities networkCapabilities) {
            super.onCapabilitiesChanged(network, networkCapabilities);
            if (NetworkUtils.isConnectedAvailableNetwork(getBaseContext())) {
                Log.d(TAG, "onCapabilitiesChanged ---> ====網(wǎng)絡(luò)可正常上網(wǎng)===網(wǎng)絡(luò)類型為: "+ NetworkUtils.getConnectedNetworkType(MainActivity.this));
            }
 
            //表明此網(wǎng)絡(luò)連接驗證成功
            if(networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)) {
                if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {
                    Log.d(TAG, "===當前在使用Mobile流量上網(wǎng)===");
                } else if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
                    Log.d(TAG, "====當前在使用WiFi上網(wǎng)===");
                } else if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_BLUETOOTH)) {
                    Log.d(TAG, "=====當前使用藍牙上網(wǎng)=====");
                } else if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET)) {
                    Log.d(TAG, "=====當前使用以太網(wǎng)上網(wǎng)=====");
                } else if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_VPN)) {
                    Log.d(TAG, "===當前使用VPN上網(wǎng)====");
                } else if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI_AWARE)) {
                    Log.d(TAG, "===表示此網(wǎng)絡(luò)使用Wi-Fi感知傳輸====");
                } else if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_LOWPAN)) {
                    Log.d(TAG, "=====表示此網(wǎng)絡(luò)使用LoWPAN傳輸=====");
                } else if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_USB)) {
                    Log.d(TAG, "=====表示此網(wǎng)絡(luò)使用USB傳輸=====");
                }
            }
 
 
        }
 
        @Override
        public void onAvailable(@NonNull Network network) {
            super.onAvailable(network);
            Log.e(TAG, "==網(wǎng)絡(luò)連接成功,通知可以使用的時候調(diào)用====onAvailable===");
        }
 
        @Override
        public void onUnavailable() {
            Log.e(TAG, "==當網(wǎng)絡(luò)連接超時或網(wǎng)絡(luò)請求達不到可用要求時調(diào)用====onUnavailable===");
            super.onUnavailable();
        }
 
        @Override
        public void onBlockedStatusChanged(@NonNull Network network, boolean blocked) {
            Log.e(TAG, "==當訪問指定的網(wǎng)絡(luò)被阻止或解除阻塞時調(diào)用===onBlockedStatusChanged==");
            super.onBlockedStatusChanged(network, blocked);
        }
 
        @Override
        public void onLosing(@NonNull Network network, int maxMsToLive) {
            Log.e(TAG, "==當網(wǎng)絡(luò)正在斷開連接時調(diào)用===onLosing===");
            super.onLosing(network, maxMsToLive);
        }
 
        @Override
        public void onLost(@NonNull Network network) {
            Log.e(TAG, "==當網(wǎng)絡(luò)已斷開連接時調(diào)用===onLost===");
            super.onLost(network);
        }
 
 
        @Override
        public void onLinkPropertiesChanged(@NonNull Network network, @NonNull LinkProperties linkProperties) {
            Log.e(TAG, "==當網(wǎng)絡(luò)連接的屬性被修改時調(diào)用===onLinkPropertiesChanged===");
            super.onLinkPropertiesChanged(network, linkProperties);
        }
    };
 
}

網(wǎng)絡(luò)工具類NetworkUtils.java

@SuppressLint("NewApi")
public class NetworkUtils {
 
    private static final String TAG = "ConnectManager";
 
    /**
     * Indicates this network uses a Cellular transport.
     */
    public static final int TRANSPORT_CELLULAR = 0;
 
    /**
     * Indicates this network uses a Wi-Fi transport.
     */
    public static final int TRANSPORT_WIFI = 1;
 
    /**
     * Indicates this network uses a Bluetooth transport.
     */
    public static final int TRANSPORT_BLUETOOTH = 2;
 
    /**
     * Indicates this network uses an Ethernet transport.
     */
    public static final int TRANSPORT_ETHERNET = 3;
 
    /**
     * Indicates this network uses a VPN transport.
     */
    public static final int TRANSPORT_VPN = 4;
 
    /**
     * Indicates this network uses a Wi-Fi Aware transport.
     */
    public static final int TRANSPORT_WIFI_AWARE = 5;
 
    /**
     * Indicates this network uses a LoWPAN transport.
     */
    public static final int TRANSPORT_LOWPAN = 6;
 
    /**
     * Indicates this network uses a Test-only virtual interface as a transport.
     * @hide
     */
    public static final int TRANSPORT_TEST = 7;
 
    /**
     * Indicates this network uses a USB transport.
     */
    public static final int TRANSPORT_USB = 8;
 
 
 
    /**
     * >= Android 10(Q版本)推薦
     *
     * 當前使用MOBILE流量上網(wǎng)
     */
    public static boolean isMobileNetwork(Context context) {
        ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
 
        Network network = cm.getActiveNetwork();
        if (null == network) {
            return false;
        }
 
        NetworkCapabilities capabilities = cm.getNetworkCapabilities(network);
        if (null == capabilities) {
            return false;
        }
        return capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)
                && capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED);
    }
 
 
    /**
     * >= Android 10(Q版本)推薦
     *
     * 當前使用WIFI上網(wǎng)
     */
 
    public static boolean isWifiNetwork(Context context) {
        ConnectivityManager cm = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
        Network network = cm.getActiveNetwork();
        if (null == network) {
            return false;
        }
        NetworkCapabilities capabilities = cm.getNetworkCapabilities(network);
        if (null == capabilities) {
            return false;
        }
        return capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)
                && capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED);
    }
 
 
    /**
     *  >= Android 10(Q版本)推薦
     *
     * 當前使用以太網(wǎng)上網(wǎng)
     */
    public static boolean isEthernetNetwork(Context context) {
        ConnectivityManager cm = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
        Network network = cm.getActiveNetwork();
        if (null == network) {
            return false;
        }
        NetworkCapabilities capabilities = cm.getNetworkCapabilities(network);
        if (null == capabilities) {
            return false;
        }
        return capabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET)
                && capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED);
    }
 
 
 
    /**
     * >= Android 10(Q版本)推薦
     *
     * NetworkCapabilities.NET_CAPABILITY_INTERNET,表示此網(wǎng)絡(luò)應(yīng)該(maybe)能夠訪問internet
     *
     *  判斷當前網(wǎng)絡(luò)可以正常上網(wǎng)
     *  表示此連接此網(wǎng)絡(luò)并且能成功上網(wǎng)。  例如,對于具有NET_CAPABILITY_INTERNET的網(wǎng)絡(luò),這意味著已成功檢測到INTERNET連接。
     */
    public static boolean isConnectedAvailableNetwork(Context context) {
        ConnectivityManager cm = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
        Network network = cm.getActiveNetwork();
        if (null == network) {
            return false;
        }
        NetworkCapabilities capabilities = cm.getNetworkCapabilities(network);
        if (null == capabilities) {
            return false;
        }
        return capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
                && capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED);
    }
 
 
    /**
     * >= Android 10(Q版本)推薦
     *
     * 獲取成功上網(wǎng)的網(wǎng)絡(luò)類型
     * value = {
     *    TRANSPORT_CELLULAR,   0 表示此網(wǎng)絡(luò)使用蜂窩傳輸。
     *    TRANSPORT_WIFI,       1 表示此網(wǎng)絡(luò)使用Wi-Fi傳輸。
     *    TRANSPORT_BLUETOOTH,  2 表示此網(wǎng)絡(luò)使用藍牙傳輸。
     *    TRANSPORT_ETHERNET,   3 表示此網(wǎng)絡(luò)使用以太網(wǎng)傳輸。
     *    TRANSPORT_VPN,        4 表示此網(wǎng)絡(luò)使用VPN傳輸。
     *    TRANSPORT_WIFI_AWARE, 5 表示此網(wǎng)絡(luò)使用Wi-Fi感知傳輸。
     *    TRANSPORT_LOWPAN,     6 表示此網(wǎng)絡(luò)使用LoWPAN傳輸。
     *    TRANSPORT_TEST,       7 指示此網(wǎng)絡(luò)使用僅限測試的虛擬接口作為傳輸。
     *    TRANSPORT_USB,        8 表示此網(wǎng)絡(luò)使用USB傳輸
     * }
     */
    public static int getConnectedNetworkType(Context context) {
        ConnectivityManager cm = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
        Network network = cm.getActiveNetwork();
        if (null == network) {
            return -1;
        }
        NetworkCapabilities capabilities = cm.getNetworkCapabilities(network);
        if (null == capabilities) {
            return -1;
        }
        if (capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)) {
            if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {
                return NetworkCapabilities.TRANSPORT_CELLULAR;
            } else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
                return NetworkCapabilities.TRANSPORT_WIFI;
            } else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_BLUETOOTH)) {
                return NetworkCapabilities.TRANSPORT_BLUETOOTH;
            } else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET)) {
                return NetworkCapabilities.TRANSPORT_ETHERNET;
            } else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_VPN)) {
                return NetworkCapabilities.TRANSPORT_VPN;
            } else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI_AWARE)) {
                return NetworkCapabilities.TRANSPORT_WIFI_AWARE;
            } else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_LOWPAN)) {
                return NetworkCapabilities.TRANSPORT_LOWPAN;
            } else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_USB)) {
                return NetworkCapabilities.TRANSPORT_USB;
            }
        }
        return -1;
    }
}

Android10之后,請使用新的API方法, 工具類可以根據(jù)業(yè)務(wù)需求去擴展, 供參考。

總結(jié)

到此這篇關(guān)于Android獲取網(wǎng)絡(luò)連接狀態(tài)新方法的文章就介紹到這了,更多相關(guān)Android獲取網(wǎng)絡(luò)連接狀態(tài)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Android App中使用RatingBar實現(xiàn)星級打分功能的教程

    Android App中使用RatingBar實現(xiàn)星級打分功能的教程

    這篇文章主要介紹了Android App中使用RatingBar實現(xiàn)星級打分功能的教程,文中舉了一個使用SeekBar與RatingBar制作的應(yīng)用內(nèi)打分條的功能,非常簡單,需要的朋友可以參考下
    2016-04-04
  • Android開發(fā)實現(xiàn)仿京東商品搜索選項卡彈窗功能

    Android開發(fā)實現(xiàn)仿京東商品搜索選項卡彈窗功能

    這篇文章主要介紹了Android開發(fā)實現(xiàn)仿京東商品搜索選項卡彈窗功能,涉及Android布局及事件響應(yīng)相關(guān)操作技巧,需要的朋友可以參考下
    2017-11-11
  • Android App數(shù)據(jù)格式Json解析方法和常見問題

    Android App數(shù)據(jù)格式Json解析方法和常見問題

    JSON數(shù)據(jù)格式,在Android中被廣泛運用于客戶端和網(wǎng)絡(luò)(或者說服務(wù)器)通信,非常有必要系統(tǒng)的了解學(xué)習(xí)。恰逢本人最近對json做了一個簡單的學(xué)習(xí),特此總結(jié)一下,以饗各位
    2014-03-03
  • android TabHost(選項卡)的使用方法

    android TabHost(選項卡)的使用方法

    Android中的選項卡是用TabHost實現(xiàn)的,下面我們用一個例子說明他的使用方法
    2013-11-11
  • Android 應(yīng)用APP加入聊天功能

    Android 應(yīng)用APP加入聊天功能

    本文主要給大家介紹的是如何一步步的實現(xiàn)Android應(yīng)用APP中加入聊天功能,十分的細致全面,有相同需求的小伙伴快來參考下吧。
    2015-03-03
  • Android編程實現(xiàn)RotateAnimation設(shè)置中心點旋轉(zhuǎn)動畫效果

    Android編程實現(xiàn)RotateAnimation設(shè)置中心點旋轉(zhuǎn)動畫效果

    這篇文章主要介紹了Android編程實現(xiàn)RotateAnimation設(shè)置中心點旋轉(zhuǎn)動畫效果,結(jié)合實例形式較為詳細的分析了Android xml布局及RotateAnimation動畫類相關(guān)操作技巧,需要的朋友可以參考下
    2018-02-02
  • Android自定義有限制區(qū)域圖例角度自識別涂鴉工具類

    Android自定義有限制區(qū)域圖例角度自識別涂鴉工具類

    這篇文章主要為大家介紹了Android自定義有限制區(qū)域圖例角度自識別涂鴉工具類,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-02-02
  • PowerManagerService之自動滅屏流程解析

    PowerManagerService之自動滅屏流程解析

    這篇文章主要為大家介紹了PowerManagerService之自動滅屏流程解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-10-10
  • Android ViewPager畫廊效果詳解及實例

    Android ViewPager畫廊效果詳解及實例

    這篇文章主要介紹了Android ViewPager畫廊效果詳解及實例的相關(guān)資料,這里提供實例代碼及實現(xiàn)效果圖,具有參考價值,需要的朋友可以參考下
    2016-12-12
  • Android Handler 機制原理解析

    Android Handler 機制原理解析

    Handler機制是Android系統(tǒng)中實現(xiàn)**線程間通信(Inter-thread Communication)**的核心機制,尤其廣泛用于將子線程中的任務(wù)結(jié)果傳遞回主線程(UI線程)進行更新操作,本文給大家介紹Android Handler 機制原理詳解,感興趣的朋友跟隨小編一起看看吧
    2025-10-10

最新評論

丰都县| 远安县| 罗田县| 南阳市| 巢湖市| 根河市| 卓尼县| 道真| 嘉禾县| 浦东新区| 凤凰县| 博爱县| 沂源县| 木兰县| 满城县| 禹城市| 壶关县| 荆门市| 安新县| 蒙阴县| 万源市| 新昌县| 清徐县| 田东县| 铁力市| 谢通门县| 祁阳县| 五指山市| 黄平县| 辽中县| 河源市| 永德县| 星子县| 安吉县| 奉化市| 南部县| 南开区| 南阳市| 文成县| 黎城县| 阿勒泰市|