1. 程式人生 > >【android】解決方案--用BroadcastReceiver監聽手機網路狀態變化

【android】解決方案--用BroadcastReceiver監聽手機網路狀態變化

實現一個功能,可以有很多種方法,但我們所追求的是最適合於自己專案的那一種方法。

就比如app要判斷網路狀態,如果在每次使用網路的時候去判斷一次網路狀態的話,有些耗費時間。例如,你要在開啟網頁之前先判斷網路是否暢通以及在下載圖片之前判斷網路型別,那麼務必造成等待時間的增加。因此,我們可以嘗試只需在手機網路狀態變更的時候,去記錄一下當前的網路狀態到我們的app裡,在使用網路的地方就無需再去主動檢查網路了。

廢話不多說,本文主要是藉助於android的廣播機制BroadcastReceiver來接收系統在網路狀態發生改變的時候發出的廣播ConnectivityManager.CONNECTIVITY_ACTION即可。

首先、寫一個BroadcastReceiver類:

  1. import android.content.BroadcastReceiver;  
  2. import android.content.Context;  
  3. import android.content.Intent;  
  4. import android.net.ConnectivityManager;  
  5. import android.util.Log;  
  6. import android.widget.Toast;  
  7. publicclass MyReceiver extends BroadcastReceiver {  
  8.     @Override
  9.     publicvoid onReceive(Context context, Intent intent) {  
  10.         String action = intent.getAction();  
  11.                 if (action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) {  
  12.                      Toast.makeText(context, "myareceiver network changed", Toast.LENGTH_LONG).show();  
  13.                      Methods.refreshAPNType(context);  
  14.              new Thread(new Runnable() {  
  15.             @Override
  16.             publicvoid run() {  
  17.                                 //其中Methods為final類,引數netWorkType為當前應用中網路型別的標誌
  18.                                 //此處需要根據專案自己做修改
  19.                 Methods.netWorkType = getAPNType(context);  
  20.             }  
  21.             }).start();  
  22.                 }  
  23.     }  
  24.     /** 
  25.      * 獲取當前的網路狀態 :沒有網路0:WIFI網路1:3G網路2:2G網路3 
  26.      *  
  27.      * @param context 
  28.      * @return 
  29.      */
  30.     privatestaticint getAPNType(Context context) {  
  31.         int netType = 0;  
  32.         ConnectivityManager connMgr = (ConnectivityManager) context  
  33.                 .getSystemService(Context.CONNECTIVITY_SERVICE);  
  34.         NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();  
  35.         if (networkInfo == null) {  
  36.             return netType;  
  37.         }  
  38.         int nType = networkInfo.getType();  
  39.         if (nType == ConnectivityManager.TYPE_WIFI) {  
  40.             netType = 1;// wifi
  41.         } elseif (nType == ConnectivityManager.TYPE_MOBILE) {  
  42.             int nSubType = networkInfo.getSubtype();  
  43.             TelephonyManager mTelephony = (TelephonyManager) context  
  44.                     .getSystemService(Context.TELEPHONY_SERVICE);  
  45.             if (nSubType == TelephonyManager.NETWORK_TYPE_UMTS  
  46.                     && !mTelephony.isNetworkRoaming()) {  
  47.                 netType = 2;// 3G
  48.             } else {  
  49.                 netType = 3;// 2G
  50.             }  
  51.         }  
  52.         return netType;  
  53.     }  
  54. }  

其次,在app啟動的activity中或AndroidManifest.xml中註冊上述的廣播接收者即可。

          方式一:在activity中註冊廣播接收者的程式碼如下:

  1. IntentFilter mFilter = new IntentFilter();  
  2.        mFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);  
  3.        MyReceiver mReceiver = new MyReceiver();  
  4.        registerReceiver(mReceiver, mFilter);  

         方式二:通過配置檔案來進行靜態註冊:

  1. <receiver  
  2. android:name="com.xxx.MyReceiver"
  3. android:label="NetworkConnection" >  
  4.             <intent-filter>  
  5.                 <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />  
  6.             </intent-filter>  
  7. </receiver>  

至此,一個完整的網路監聽功能寫完啦。

轉自http://blog.csdn.net/wanggsx918/article/details/42918343