Android中的網絡鏈接問題NetworkInfo


百度搜索 如何判斷android網絡是否可用,會有一大堆的結果。

但是最終結底還是用networkInfo.isAvailable來判斷的,但是經過我的實驗,我發現此方法只是判斷手機聯網狀態是否就緒,而不是真的判斷忘絡是否已經鏈接。

下面貼出我的測試經過。

測試機型:華為榮耀3C ROM miui v6(其他機型是否如此有待驗證,且真機和虛擬的結果肯定是有出入,所以這方面最好用真機來測試)

測試代碼:

//AndroidManifest.xml中需加入權限<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo[] networkInfos = cm.getAllNetworkInfo();
        for (NetworkInfo info : networkInfos) {
            Log.i("AAA", info.getTypeName() + " is connected " + info.isConnected() + " isAvailable " + info.isAvailable());
        }
        NetworkInfo info = cm.getActiveNetworkInfo();
        if (info != null)
            Log.i("AAA", "network type is " + info.getTypeName()
                    + " network is available " + info.isAvailable()
                    + " network is connected " + info.isConnected());

 測試經過:

第一步:WIFI打開並連接網絡,數據開關打開。打印結果:

 mobile is connected false isAvailable true WIFI is connected true isAvailable true
 mobile_mms is connected false isAvailable true
 mobile_supl is connected false isAvailable true
 mobile_dun is connected false isAvailable true
 mobile_hipri is connected false isAvailable true
 BLUETOOTH_TETHER is connected false isAvailable false
 ETHERNET is connected false isAvailable false
 mobile_fota is connected false isAvailable true
 mobile_ims is connected false isAvailable true
 mobile_cbs is connected false isAvailable true
 active network type is WIFI network is available true network is connected true

第二步 :WIFI打開,但是沒有連接網絡,數據開關打開連接數據流量。打印結果:

 mobile is connected true isAvailable true WIFI is connected false isAvailable true
 mobile_mms is connected false isAvailable true
 mobile_supl is connected false isAvailable true
 mobile_dun is connected false isAvailable true
 mobile_hipri is connected false isAvailable true
 BLUETOOTH_TETHER is connected false isAvailable false
 ETHERNET is connected false isAvailable false
 mobile_fota is connected false isAvailable true
 mobile_ims is connected false isAvailable true
 mobile_cbs is connected false isAvailable true
 active network type is mobile network is available true network is connected true

經過上面對比可知:當wifi打開時,數據連接其實是沒有連接的。wifi開關只要是打開的,不管有沒有連接wifi ,wifi都是Available的。

第三步:關閉wifi開關,數據開關開始並已經連接數據流量。 打印結果:

 mobile is connected true isAvailable true WIFI is connected false isAvailable false
 mobile_mms is connected false isAvailable true
 mobile_supl is connected false isAvailable true
 mobile_dun is connected false isAvailable true
 mobile_hipri is connected false isAvailable true
 BLUETOOTH_TETHER is connected false isAvailable false
 ETHERNET is connected false isAvailable false
 mobile_fota is connected false isAvailable true
 mobile_ims is connected false isAvailable true
 mobile_cbs is connected false isAvailable true
 active network type is mobile network is available true network is connected true

結論1:只有當wifi關閉的時候 wifi的available狀態才是false的

第四步:關閉wifi開關和數據開關。打印結果:

 mobile is connected false isAvailable true WIFI is connected false isAvailable false
 mobile_mms is connected false isAvailable true
 mobile_supl is connected false isAvailable true
 mobile_dun is connected false isAvailable true
 mobile_hipri is connected false isAvailable true
 BLUETOOTH_TETHER is connected false isAvailable false
 ETHERNET is connected false isAvailable false
 mobile_fota is connected false isAvailable true
 mobile_ims is connected false isAvailable true
 mobile_cbs is connected false isAvailable true

發現,當wifi開關關閉的時候 wifi的available狀態是 false的,但是當關閉數據連接的開關的時候,mobile的連接狀態 isConnected雖然是false但是Available仍然是true的。

而且最后一行Log沒有打出來說明此時getActiveNetworkInfo()的返回值是null

上面的四個步驟都是在手機SIM卡有信號的情況下測試的。也就是說只要打開數據開關數據連接就能連上的情況下測試的。正常情況下應該還要測試當手機卡沒有信號的情況下的結果,但是這種情況不太好模擬,所以我就到

sim卡管理中心把sim給禁用掉了。具體沒有研究過,所以不太清楚這種情況能不能模擬手機沒有信號的情況這個待定。

打印的結果如下:

 mobile is connected false isAvailable false
 WIFI is connected false isAvailable false
 mobile_mms is connected false isAvailable false
 mobile_supl is connected false isAvailable false
 mobile_dun is connected false isAvailable false
 mobile_hipri is connected false isAvailable false
 BLUETOOTH_TETHER is connected false isAvailable false
 ETHERNET is connected false isAvailable false
 mobile_fota is connected false isAvailable false
 mobile_ims is connected false isAvailable false
 mobile_cbs is connected false isAvailable false

不出意外,此時的mobile的available狀態已經成為了false。

 

其實通過NetworkInfo的api中就可以看出來


isAvailable
的解釋是:Indicates whether network connectivity is possible.   表明網絡連接是否posible,posible可能的意思,而並不是已經連接

isConnected():Indicates whether network connectivity exists and it is possible to establish connections and pass data.表明網絡連接是否存在並且可以傳遞數據。

這兩處的連接用的是 connectivity名詞。在此處可以理解為  “建立鏈接”這一事實。(本人英語渣渣般的存在,如果不對,請無視)。

當然百度搜索網絡連接是否可用,給的結果用isAvailable判斷是否可用也無可厚非,因為這個確實是判斷網絡是否可用的,谷歌給出的解釋也是這個意思,只是這個地方的可用只是一種可能性的判斷,是判斷網絡狀態是否已經准備好可以用來建立連接了。

所以,判斷網絡是否已經建立鏈接,並且可以上網了的判斷應該是醬紫的:

public boolean isNetWorkConnected() {
        boolean isConnected = false;
        ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo activeInfo = cm.getActiveNetworkInfo();
        if (activeInfo != null && activeInfo.isAvailable() && activeInfo.isConnected()) {
            isConnected = true;
        }
        return isConnected;
    }

應該就是這樣。

至於像騰訊的那種wifi鏈接上,但是連接像CMCC這種沒有登錄賬號就不能用的wifi后提示網絡不可用的方法。暫時沒有從api中找到思路,不過看到有網友說可以請求一下一個接口,如果TimeOut的話就是wifi不可用,私以為此方法可行,如果你感覺你們的服務器穩定性不是很好,可以背靠大公司呀,向BAT這樣的網站發起一個http請求,如果響應超時,我想一般情況下就是你手機網絡設置的問題了。(當然我大企鵝的肯定沒有這么簡單,他們是有socket連接的,心里默念企鵝大法好,BAT技術的牛逼性大家有目共睹。)

以上。

如果有不對的地方還請指正!

 


免責聲明!

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



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