Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android Network --判斷網絡狀態(網絡的連接,改變,和判斷2G/3G/4G)

Android Network --判斷網絡狀態(網絡的連接,改變,和判斷2G/3G/4G)

編輯:關於Android編程



現在app大多都需要從網絡上獲得數據。所以訪問網絡是在所難免。但是再訪問網絡之前,我們應該先做一下網絡的狀態判斷。其實在訪問網絡之前我們要做一些狀態判斷,對應一些狀態判斷來做處理,並不是直接使用Http訪問網絡即可。很多人在開發就經常把網絡這塊直接跳過,直接訪問網絡,可以一斷網,各種體驗效果不好,不是說app沒法用,只是體驗效果差。還有,就是我們可能為用戶考慮,因為現在一般連網是wifi和手機流量,都知道後者收費是比較高的。假如我們的app加載的圖片或者有大的數據下載操作,可是用戶的本意是要是在流量下的話就不要操作這些很費流量的的操作,這樣就必須要我們做一些連網狀態的判斷。網絡是否連接良好,連接的wifi還是流量,斷網或者網絡改變了的時候怎麼做,這都是一些細節,但是要注意處理。

 

我們在做訪問的時候都得進行判斷是否連網。判斷連網也比較簡單,就用到了兩個類。ConnectivityManager和NetworkInfo。

 

只要執行下面的代碼就可以了。

	ConnectivityManager connMgr = (ConnectivityManager) context
				.getSystemService(Context.CONNECTIVITY_SERVICE);
		NetworkInfo networkInfo = connMgr
				.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
		boolean isWifiConn = networkInfo.isConnected();
		networkInfo = connMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
		boolean isMobileConn = networkInfo.isConnected();

 

只要有一個連接就是有網,NetworkInfo就是網絡的信息。還有一種更簡便的判斷是否連網的方法。

ConnectivityManager connMgr = (ConnectivityManager) context
				.getSystemService(Context.CONNECTIVITY_SERVICE);
		NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();

 

在一個就是監聽網絡變化,就是設置一個廣播。

注冊廣播,監聽ConnectivityManager.CONNECTIVITY_ACTION這個action

IntentFilter filter = new IntentFilter(
					ConnectivityManager.CONNECTIVITY_ACTION);
			receiver = new NetworkReceiver();
			context.registerReceiver(receiver, filter);

 

再實現一個廣播類就可以了。這樣網絡一變化,就會受到廣播,然後執行對應操作了。

public class NetworkReceiver extends BroadcastReceiver {
		@Override
		public void onReceive(Context context, Intent intent) {
			Log.i("TAG", "intent============>>>>" + intent.toString());
			
		}
	}


下面就是來說一下判斷手機網絡的類型了,2G,3G,4G

關於網絡類型,在得到networkInfo = connMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);這個後,確定是手機網絡後,通過networkInfo.getSubtype()會得到網絡的類型,用networkInfo.getSubtypeName()會得到網絡的名字。

我們通過這個networkInfo.getSubtype()得到的類型來判斷當前是什麼網絡。

其實,Android的Api中已經定義了各種網絡狀態,不是在ConnectivityManager裡面定義的,而是在TelephonyManager裡面的定義的。通過不同的api版本的修改,目前增加到了14個狀態值:

下面是通過自己查資料,和看別人查資料實驗得來的。整理如下:

 

		--------------------Added in API level 1---------------------
		public static final int NETWORK_TYPE_UNKNOWN
		Network type is unknown
		Constant Value: 0 (0x00000000)
		(不知道網絡類型)

		public static final int NETWORK_TYPE_GPRS
		Current network is GPRS
		Constant Value: 1 (0x00000001)
		(2.5G)移動和聯通
		
		public static final int NETWORK_TYPE_EDGE
		Current network is EDGE
		Constant Value: 2 (0x00000002)
		(2.75G)2.5G到3G的過渡    移動和聯通
		
		public static final int NETWORK_TYPE_UMTS
		Current network is UMTS
		Constant Value: 3 (0x00000003)
		(3G)聯通
		
		-----------------Added in API level 4---------------------
		public static final int NETWORK_TYPE_CDMA
		Current network is CDMA: Either IS95A or IS95B
		Constant Value: 4 (0x00000004)
		(2G 電信)
		
		public static final int NETWORK_TYPE_EVDO_0
		Current network is EVDO revision 0
		Constant Value: 5 (0x00000005)
		( 3G )電信

		public static final int NETWORK_TYPE_EVDO_A
		Current network is EVDO revision A
		Constant Value: 6 (0x00000006)
		(3.5G) 屬於3G過渡
		
		public static final int NETWORK_TYPE_1xRTT
		Current network is 1xRTT
		Constant Value: 7 (0x00000007)
		( 2G )
		
		---------------------Added in API level 5--------------------
		public static final int NETWORK_TYPE_HSDPA
		Current network is HSDPA
		Constant Value: 8 (0x00000008)
		(3.5G )
		
		public static final int NETWORK_TYPE_HSUPA
		Current network is HSUPA
		Constant Value: 9 (0x00000009)
		( 3.5G )
		
		public static final int NETWORK_TYPE_HSPA
		Current network is HSPA
		Constant Value: 10 (0x0000000a)
		( 3G )聯通
		
		--------------------------Added in API level 8-------------------------
		public static final int NETWORK_TYPE_IDEN
		Current network is iDen
		Constant Value: 11 (0x0000000b)
		(2G )
		
		--------------------------Added in API level 9-------------------------
		public static final int NETWORK_TYPE_EVDO_B
		Current network is EVDO revision B
		Constant Value: 12 (0x0000000c)
		3G-3.5G
		
		--------------------------Added in API level 11------------------------
		public static final int NETWORK_TYPE_LTE
		Current network is LTE
		Constant Value: 13 (0x0000000d)
		(4G)
		
		public static final int NETWORK_TYPE_EHRPD
		Current network is eHRPD
		Constant Value: 14 (0x0000000e)
		3G(3G到4G的升級產物)
		
		
		--------------------------Added in API level 13---------------------------
		public static final int NETWORK_TYPE_HSPAP
		Current network is HSPA+
		Constant Value: 15 (0x0000000f)
		( 3G )

 

所以我們可以networkInfo.getSubtype()得到值和上面的進行對應,就知道目前是幾G網絡了。由於手裡的手機卡有限,所以有些不全,歡迎大家補充,共享。

 

 

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved