android監(jiān)聽(tīng)網(wǎng)絡(luò)狀態(tài)的變化及實(shí)戰(zhàn)的示例代碼

平時(shí)我們?cè)谡?qǐng)求錯(cuò)誤的情況下,通常會(huì)進(jìn)行處理一下,一般來(lái)說(shuō),主要分為兩方面的錯(cuò)誤

專注于為中小企業(yè)提供網(wǎng)站設(shè)計(jì)制作、做網(wǎng)站服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)涇縣免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了成百上千家企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過(guò)網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。

  1. 沒(méi)有網(wǎng)絡(luò)的錯(cuò)誤
  2. 在有網(wǎng)絡(luò)的情況下,我們客戶端的錯(cuò)誤或者服務(wù)器端的錯(cuò)誤

今天這篇博客主要闡述以下問(wèn)題

  1. 怎樣監(jiān)聽(tīng)網(wǎng)絡(luò)狀態(tài)的變化,包括是否打開(kāi)WiFi,否打開(kāi)數(shù)據(jù)網(wǎng)絡(luò),當(dāng)前連接的網(wǎng)絡(luò)是否可用
  2. 網(wǎng)絡(luò)沒(méi)有打開(kāi)情況下的處理,如彈出對(duì)話框,跳轉(zhuǎn)到 打開(kāi) WiFi設(shè)置的界面等
  3. 非WiFi情況下是否加載圖片,是否播放視頻等

實(shí)現(xiàn)思路

在網(wǎng)絡(luò)錯(cuò)誤的情況下獲取網(wǎng)絡(luò)狀態(tài)進(jìn)行判斷,這種方法是可行的,但你想過(guò)了沒(méi)有,如果每次都要進(jìn)行這樣的判斷,豈不是代碼量很多?有人會(huì)說(shuō),那把代碼封裝到一個(gè)類不就好了嗎?這樣確實(shí)能減少代碼量,但是每次都要主動(dòng)去獲取,這樣是不是挺麻煩的。實(shí)際上,google 早就幫我們封裝好了,在網(wǎng)絡(luò)狀態(tài)變化的情況下會(huì)發(fā)出廣播,我們只需要監(jiān)聽(tīng)廣播就好了 。

使用靜態(tài)廣播還是動(dòng)態(tài)注冊(cè)廣播的方式好呢?

如果你不太清楚的話,我只能說(shuō)即 基礎(chǔ)不扎實(shí)。我們的應(yīng)用之所以要監(jiān)聽(tīng)網(wǎng)絡(luò)狀態(tài)的 變化,主要是為了在錯(cuò)誤的情況下方便進(jìn)行處理,退出我們當(dāng)前的應(yīng)用之后當(dāng)然不需要監(jiān)聽(tīng)了,所以選擇動(dòng)態(tài)注冊(cè)廣播。

  1. 動(dòng)態(tài)注冊(cè):隨著所在的Activity或者應(yīng)用銷毀 以后,不會(huì)受到該廣播
  2. 靜態(tài)注冊(cè):退出應(yīng)用后,仍然能夠收到相應(yīng)的廣播

共同點(diǎn):都需要在AndroidMainest清單文件里面注冊(cè)

通過(guò)廣播監(jiān)聽(tīng)網(wǎng)絡(luò)狀態(tài)的兩種方法

靜態(tài)注冊(cè)

<receiver android:name=".network.NetworkConnectChangedReceiver">
  <intent-filter>
    <action android:name="android.NET.conn.CONNECTIVITY_CHANGE" />
    <action android:name="android.Net.wifi.WIFI_STATE_CHANGED" />
    <action android:name="android.net.wifi.STATE_CHANGE" />
  </intent-filter>
</receiver>

動(dòng)態(tài)注冊(cè)

第一步:在AndroidMainest文件里面注冊(cè)

<receiver android:name=".network.NetworkConnectChangedReceiver">
    </receiver>

第二步:調(diào)用 Context registerReceiver(Receiver,IntentFilter) 進(jìn)行注冊(cè)

IntentFilter filter = new IntentFilter();
filter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
filter.addAction("android.net.wifi.WIFI_STATE_CHANGED");
filter.addAction("android.net.wifi.STATE_CHANGE");
registerReceiver(mNetworkChangeListener,filter);

我們自定義的NetworkChangeListener廣播

/**
 * 網(wǎng)絡(luò)改變監(jiān)控廣播
 * <p>
 * 監(jiān)聽(tīng)網(wǎng)絡(luò)的改變狀態(tài),只有在用戶操作網(wǎng)絡(luò)連接開(kāi)關(guān)(wifi,mobile)的時(shí)候接受廣播,
 * 然后對(duì)相應(yīng)的界面進(jìn)行相應(yīng)的操作,并將 狀態(tài) 保存在我們的APP里面
 * <p>
 * <p>
 * Created by xujun
 */
public class NetworkConnectChangedReceiver extends BroadcastReceiver {

  private static final String TAG = "xujun";
  public static final String TAG1 = "xxx";

  @Override
  public void onReceive(Context context, Intent intent) {
    // 這個(gè)監(jiān)聽(tīng)wifi的打開(kāi)與關(guān)閉,與wifi的連接無(wú)關(guān)
    if (WifiManager.WIFI_STATE_CHANGED_ACTION.equals(intent.getAction())) {
      int wifiState = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, 0);
      Log.e(TAG1, "wifiState" + wifiState);
      switch (wifiState) {
        case WifiManager.WIFI_STATE_DISABLED:
          APP.getInstance().setEnablaWifi(false);
          break;
        case WifiManager.WIFI_STATE_DISABLING:

          break;
        case WifiManager.WIFI_STATE_ENABLING:
          break;
        case WifiManager.WIFI_STATE_ENABLED:
          APP.getInstance().setEnablaWifi(true);
          break;
        case WifiManager.WIFI_STATE_UNKNOWN:
          break;
        default:
          break;


      }
    }
    // 這個(gè)監(jiān)聽(tīng)wifi的連接狀態(tài)即是否連上了一個(gè)有效無(wú)線路由,當(dāng)上邊廣播的狀態(tài)是WifiManager
    // .WIFI_STATE_DISABLING,和WIFI_STATE_DISABLED的時(shí)候,根本不會(huì)接到這個(gè)廣播。
    // 在上邊廣播接到廣播是WifiManager.WIFI_STATE_ENABLED狀態(tài)的同時(shí)也會(huì)接到這個(gè)廣播,
    // 當(dāng)然剛打開(kāi)wifi肯定還沒(méi)有連接到有效的無(wú)線
    if (WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(intent.getAction())) {
      Parcelable parcelableExtra = intent
          .getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
      if (null != parcelableExtra) {
        NetworkInfo networkInfo = (NetworkInfo) parcelableExtra;
        State state = networkInfo.getState();
        boolean isConnected = state == State.CONNECTED;// 當(dāng)然,這邊可以更精確的確定狀態(tài)
        Log.e(TAG1, "isConnected" + isConnected);
        if (isConnected) {
          APP.getInstance().setWifi(true);
        } else {
          APP.getInstance().setWifi(false);
        }
      }
    }
    // 這個(gè)監(jiān)聽(tīng)網(wǎng)絡(luò)連接的設(shè)置,包括wifi和移動(dòng)數(shù)據(jù)的打開(kāi)和關(guān)閉。.
    // 最好用的還是這個(gè)監(jiān)聽(tīng)。wifi如果打開(kāi),關(guān)閉,以及連接上可用的連接都會(huì)接到監(jiān)聽(tīng)。見(jiàn)log
    // 這個(gè)廣播的最大弊端是比上邊兩個(gè)廣播的反應(yīng)要慢,如果只是要監(jiān)聽(tīng)wifi,我覺(jué)得還是用上邊兩個(gè)配合比較合適
    if (ConnectivityManager.CONNECTIVITY_ACTION.equals(intent.getAction())) {
      ConnectivityManager manager = (ConnectivityManager) context
          .getSystemService(Context.CONNECTIVITY_SERVICE);
      Log.i(TAG1, "CONNECTIVITY_ACTION");

      NetworkInfo activeNetwork = manager.getActiveNetworkInfo();
      if (activeNetwork != null) { // connected to the internet
        if (activeNetwork.isConnected()) {
          if (activeNetwork.getType() == ConnectivityManager.TYPE_WIFI) {
            // connected to wifi
            APP.getInstance().setWifi(true);
            Log.e(TAG, "當(dāng)前WiFi連接可用 ");
          } else if (activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE) {
            // connected to the mobile provider's data plan
            APP.getInstance().setMobile(true);
            Log.e(TAG, "當(dāng)前移動(dòng)網(wǎng)絡(luò)連接可用 ");
          }
        } else {
          Log.e(TAG, "當(dāng)前沒(méi)有網(wǎng)絡(luò)連接,請(qǐng)確保你已經(jīng)打開(kāi)網(wǎng)絡(luò) ");
        }


        Log.e(TAG1, "info.getTypeName()" + activeNetwork.getTypeName());
        Log.e(TAG1, "getSubtypeName()" + activeNetwork.getSubtypeName());
        Log.e(TAG1, "getState()" + activeNetwork.getState());
        Log.e(TAG1, "getDetailedState()"
            + activeNetwork.getDetailedState().name());
        Log.e(TAG1, "getDetailedState()" + activeNetwork.getExtraInfo());
        Log.e(TAG1, "getType()" + activeNetwork.getType());
      } else {  // not connected to the internet
        Log.e(TAG, "當(dāng)前沒(méi)有網(wǎng)絡(luò)連接,請(qǐng)確保你已經(jīng)打開(kāi)網(wǎng)絡(luò) ");
        APP.getInstance().setWifi(false);
        APP.getInstance().setMobile(false);
        APP.getInstance().setConnected(false);
      }
    }
  }
}

 最后,別忘記添加一下權(quán)限

<uses-permission android:name="android.permission.INTERNET"/>

 <!--允許讀取網(wǎng)絡(luò)狀態(tài)-->
 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
<!--允許讀取wifi網(wǎng)絡(luò)狀態(tài)-->
 <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>

思路解析

從上面的代碼中,我們可以知道我們將我們當(dāng)前的網(wǎng)絡(luò)狀態(tài)保存在我們的 APP 里面,這樣當(dāng)網(wǎng)絡(luò)狀態(tài)變化的時(shí)候會(huì)自動(dòng)去改變 APP 里面相應(yīng)的狀態(tài)量,我們進(jìn)行網(wǎng)絡(luò)處理的 時(shí)候只需要去獲取 APP里面的狀態(tài)量,便可以判斷出是屬于哪一種網(wǎng)絡(luò)錯(cuò)誤,是不是很方便呢。

至于廣播的Action主要有三種類型:

WifiManager.WIFI_STATE_CHANGED_ACTION

這個(gè)監(jiān)聽(tīng)wifi的打開(kāi)與關(guān)閉,與wifi的連接無(wú)關(guān)

WifiManager.NETWORK_STATE_CHANGED_ACTION:

這個(gè)監(jiān)聽(tīng)wifi的連接狀態(tài)即是否連上了一個(gè)有效無(wú)線路由,當(dāng)上邊廣播的狀態(tài)是WifiManager.WIFI_STATE_DISABLING,和WIFI_STATE_DISABLED的時(shí)候,根本不會(huì)接到這個(gè)廣播。

在上邊廣播接到廣播是WifiManager.WIFI_STATE_ENABLED狀態(tài)的同時(shí)也會(huì)接到這個(gè)廣播,當(dāng)然剛打開(kāi)wifi肯定還沒(méi)有連接到有效的無(wú)線

ConnectivityManager.CONNECTIVITY_ACTION

這個(gè)監(jiān)聽(tīng)網(wǎng)絡(luò)連接的設(shè)置,包括wifi和移動(dòng)數(shù)據(jù)的打開(kāi)和關(guān)閉。.

最好用的還是這個(gè)監(jiān)聽(tīng)。wifi如果打開(kāi),關(guān)閉,以及連接上可用的連接都會(huì)接到監(jiān)聽(tīng)。這個(gè)廣播的最大弊端是比上邊兩個(gè)廣播的反應(yīng)要慢,如果只是要監(jiān)聽(tīng)wifi,我覺(jué)得還是用上邊兩個(gè)配合比較合適。

至于這個(gè)ConnectivityManager,NetworkInfo是什么東西,別急,下面會(huì)大概介紹一下。

ConnectivityManager和NetworkInfo

ConnectivityManager主要用來(lái)干什么

  1. Monitor network connections (Wi-Fi, GPRS, UMTS, etc.) (用來(lái)處理網(wǎng)絡(luò)連接 ,包括Wi-Fi, GPRS, UMTS等)
  2. Send broadcast intents when network connectivity changes(用 網(wǎng)絡(luò)狀態(tài)發(fā)生變化的時(shí)候發(fā)出 廣播 )
  3. Attempt to “fail over” to another network when connectivity to a network is lost(但斷開(kāi)網(wǎng)絡(luò)連接的時(shí)候,嘗試去;連接另外一個(gè)網(wǎng)絡(luò)
  4. Provide an API that allows applications to query the coarse-grained or fine-grained state of the available networks(
  5. Provide an API that allows applications to request and select networks for their data traffic

怎樣獲取ConnectivityManager對(duì)象呢?

ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context
    .CONNECTIVITY_SERVICE);

獲取 NetworkInfo對(duì)象

主要有一下 幾種方法

  1. getNetworkInfo(int networkType),但是這個(gè)方法已經(jīng)過(guò)時(shí),官網(wǎng)的解釋如下:This method was deprecated in API level 23. This method does not support multiple connected networks of the same type. Use getAllNetworks() and getNetworkInfo(android.net.Network) instead.
  2. getNetworkInfo(Network network)
  3. getActiveNetwork()
  4. Returns a Network object corresponding to the currently active default data network.
  5. getActiveNetworkInfo(),Returns details about the currently active default data network.
  6. getAllNetworkInfo()這個(gè)方法已經(jīng)過(guò)時(shí),Use getAllNetworks() and getNetworkInfo(android.net.Network) instead.

綜上所述,我們?nèi)绻喇?dāng)前Mobile網(wǎng)絡(luò)或者WiFi網(wǎng)絡(luò)是否已經(jīng)連接上,總共有兩種方法。

第一種方法,只不過(guò)在 API23的時(shí)候已經(jīng) 過(guò)時(shí)了

State wifiState = null;
State mobileState = null;

ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context
    .CONNECTIVITY_SERVICE);
wifiState = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState();
mobileState = cm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState();

Log.d(TAG1,
    "wifi狀態(tài):" + wifiState + "\n mobile狀態(tài):" + mobileState);

if (wifiState != null && mobileState != null
    && State.CONNECTED != wifiState
    && State.CONNECTED == mobileState) {// 手機(jī)網(wǎng)絡(luò)連接成功 
  Log.d(TAG1, "手機(jī)2g/3g/4g網(wǎng)絡(luò)連接成功");

  APP.getInstance().setMobile(true);
  APP.getInstance().setWifi(false);
  APP.getInstance().setConnected(true);

} else if (wifiState != null && State.CONNECTED == wifiState) {// 無(wú)線網(wǎng)絡(luò)連接成功 
  Log.d(TAG1, "無(wú)線網(wǎng)絡(luò)連接成功");

  APP.getInstance().setMobile(false);
  APP.getInstance().setWifi(true);
  APP.getInstance().setConnected(true);

} else if (wifiState != null && mobileState != null
    && State.CONNECTED != wifiState
    && State.CONNECTED != mobileState) {// 手機(jī)沒(méi)有任何的網(wǎng)絡(luò) 
  Log.d(TAG1, "手機(jī)沒(méi)有任何的網(wǎng)絡(luò)");

  APP.getInstance().setMobile(false);
  APP.getInstance().setWifi(false);
  APP.getInstance().setConnected(false);

}

第二種方法

ConnectivityManager manager = (ConnectivityManager) context
    .getSystemService(Context.CONNECTIVITY_SERVICE);
Log.i(TAG1, "CONNECTIVITY_ACTION");

NetworkInfo activeNetwork = manager.getActiveNetworkInfo();
if (activeNetwork != null) { // connected to the internet
  if (activeNetwork.isConnected()) {
    if (activeNetwork.getType() == ConnectivityManager.TYPE_WIFI) {
      // connected to wifi
      APP.getInstance().setWifi(true);
      Log.e(TAG, "當(dāng)前WiFi連接可用 ");
    } else if (activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE) {
      // connected to the mobile provider's data plan
      APP.getInstance().setMobile(true);
      Log.e(TAG, "當(dāng)前移動(dòng)網(wǎng)絡(luò)連接可用 ");
    }
  } else {
    Log.e(TAG, "當(dāng)前沒(méi)有網(wǎng)絡(luò)連接,請(qǐng)確保你已經(jīng)打開(kāi)網(wǎng)絡(luò) ");
  }
} else {  // not connected to the internet
  Log.e(TAG, "當(dāng)前沒(méi)有網(wǎng)絡(luò)連接,請(qǐng)確保你已經(jīng)打開(kāi)網(wǎng)絡(luò) ");
  APP.getInstance().setWifi(false);
  APP.getInstance().setMobile(false);
  APP.getInstance().setConnected(false);
}

網(wǎng)絡(luò)錯(cuò)誤情況的處理

正如前面所提到的,這篇博客吧網(wǎng)絡(luò)錯(cuò)誤主要分為兩大類

  1. 沒(méi)有網(wǎng)絡(luò)情況的錯(cuò)誤
  2. 在有網(wǎng)絡(luò)的情況下,我們客戶端的錯(cuò)誤或者服務(wù)器端的錯(cuò)誤

在這里 我們主要處理沒(méi)有網(wǎng)絡(luò)情況下的錯(cuò)誤,現(xiàn)在 個(gè)人了解到 的主要有兩種處理方法。

第一種做法

在APP啟動(dòng)的 時(shí)候檢查當(dāng)前是否已經(jīng)連接上網(wǎng)絡(luò),彈出一個(gè)對(duì)話框沒(méi)有的話跳轉(zhuǎn)到設(shè)置界面或者WiFi設(shè)置界面或者打開(kāi)移動(dòng)網(wǎng)絡(luò)界面 。

第二種方法

其實(shí)跟第一種做法差不多,只是在每一次 錯(cuò)誤的情況下,都會(huì)判斷當(dāng)前有沒(méi)有 網(wǎng)絡(luò) ,沒(méi)有彈出一個(gè)對(duì)話框,跳轉(zhuǎn)到設(shè)置界面或者WiFi設(shè)置界面或者打開(kāi)移動(dòng)網(wǎng)絡(luò)界面 , 下面我們我們一起來(lái)看一下 怎樣彈出一個(gè)對(duì)話框,并且跳轉(zhuǎn)到相應(yīng)的設(shè)置界面

這里我們采取第一種做法,效果圖如下

android 監(jiān)聽(tīng)網(wǎng)絡(luò)狀態(tài)的變化及實(shí)戰(zhàn)的示例代碼

代碼如下

public static void showWifiDlg(final Context context) {
  AlertDialog.Builder builder = new AlertDialog.Builder(context.getApplicationContext());
  if (mWifiDialog == null) {
    mWifiDialog = builder.setIcon(R.drawable.ic_launcher)     //
        .setTitle("wifi設(shè)置")      //
        .setMessage("當(dāng)前無(wú)網(wǎng)絡(luò)").setPositiveButton("設(shè)置", new DialogInterface
            .OnClickListener() {

          @Override
          public void onClick(DialogInterface dialog, int which) {
            // 跳轉(zhuǎn)到系統(tǒng)的網(wǎng)絡(luò)設(shè)置界面
            Intent intent = null;
            // 先判斷當(dāng)前系統(tǒng)版本
            if (android.os.Build.VERSION.SDK_INT > 10) { // 3.0以上
              intent = new Intent(android.provider.Settings
                  .ACTION_WIFI_SETTINGS);
            } else {
              intent = new Intent();
              intent.setClassName("com.android.settings",
                  Settings.ACTION_WIFI_SETTINGS);
            }
            if ((context instanceof Application)) {
              intent.addFlags(FLAG_ACTIVITY_NEW_TASK);
            }
            context.startActivity(intent);

          }
        }).setNegativeButton("知道了", null).create();
    // 設(shè)置為系統(tǒng)的Dialog,這樣使用Application的時(shí)候不會(huì) 報(bào)錯(cuò)
    mWifiDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
  }
  mWifiDialog.show();
}

這里對(duì)幾個(gè) 重要的 Action說(shuō)一下

ACTION_DATA_ROAMING_SETTINGS: 跳轉(zhuǎn)到移動(dòng)網(wǎng)絡(luò)設(shè)置界面

ACTION_WIFI_SETTINGS

Activity Action: Show settings to allow configuration of Wi-Fi.

ACTION_WIRELESS_SETTINGS

Activity Action: Show settings to allow configuration of wireless controls such as Wi-Fi, Bluetooth and Mobile networks.

關(guān)于更多Activity Action,請(qǐng)參考官網(wǎng)地址

需要注意的是

若我們 使用的Context不是Activity 的Context 而是Application的 Context,我們 需要做以下處理 ,否則會(huì)報(bào)錯(cuò)

// 設(shè)置為系統(tǒng)級(jí)別的Dialog
mWifiDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);

if ((context instanceof Application)) {              intent.addFlags(FLAG_ACTIVITY_NEW_TASK);
 }
context.startActivity(intent);

在AndroidMainFest中添加以下權(quán)限 。

 <!--允許 彈出系統(tǒng)級(jí)別的AlterDialog-->
  <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>

智能無(wú)圖

智能無(wú)圖,這種瀏覽模式我們平時(shí) 很常見(jiàn),比如在UC瀏覽器中,網(wǎng)易新聞中都有看到這種模式,這種模式的實(shí)質(zhì)就是監(jiān)聽(tīng)網(wǎng)絡(luò)狀態(tài),再根據(jù)是否是WiFi去確定是否加載網(wǎng)絡(luò)圖片。

效果圖如下

我們可以看到在開(kāi)啟智能無(wú)圖的情況下,若不是連接WiFi ,我們是不會(huì)去加載網(wǎng)絡(luò)圖片的。

android 監(jiān)聽(tīng)網(wǎng)絡(luò)狀態(tài)的變化及實(shí)戰(zhàn)的示例代碼

實(shí)現(xiàn)的核心代碼如下

1)當(dāng)智能無(wú)圖模式變化的時(shí)候,我們會(huì)把標(biāo)志存進(jìn)SharePreferences中

mSwitchWifiPic.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
  @Override
  public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

    SPUtils.put(SPConstants.isIntelligentNoPic,isChecked);

  }
});

同時(shí)我們?yōu)榱诉M(jìn)來(lái)的時(shí)候界面與SharePreferences中的 isIntelligentNoPic的值保持一致,我們需要調(diào)用一下代碼

boolean isIntelligentNoPic = SPUtils.getBoolean(SPConstants.isIntelligentNoPic);
mSwitchWifiPic.setChecked(isIntelligentNoPic);

2)在NewsListAdapter中

// 是否開(kāi)啟智能無(wú)圖模式,true表示開(kāi)啟智能無(wú)圖模式
boolean isIntelligentNoPic = SPUtils.getBoolean(Constants.SPConstants.isIntelligentNoPic);
WriteLogUtil.i("isIntelligentNoPic=" + isIntelligentNoPic);
if (isIntelligentNoPic) {
  if (APP.getInstance().isWifi()) {
    GlideUtils.display(mContext, iv, picUrl);
  } else {
    iv.setImageDrawable(new ColorDrawable(Color.GRAY));
  }

} else {
  GlideUtils.display(mContext, iv, picUrl);
}

至于APP.getInstance().isWifi()表示當(dāng)前是否連接WiFi,是通過(guò) 監(jiān)聽(tīng)廣播實(shí)現(xiàn)的 ,前面已經(jīng)說(shuō)明了,這里就不再闡述了。

拓展工具類

public class NetStateUtils {

  /**
   * 判斷當(dāng)前網(wǎng)絡(luò)是否是移動(dòng)網(wǎng)絡(luò)
   *
   * @param context
   * @return boolean
   */
  public static boolean is3G(Context context) {
    ConnectivityManager connectivityManager = (ConnectivityManager) context
        .getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetInfo = connectivityManager.getActiveNetworkInfo();
    if (activeNetInfo != null
        && activeNetInfo.getType() == ConnectivityManager.TYPE_MOBILE) {
      return true;
    }
    return false;
  }

  /**
   * 判斷當(dāng)前網(wǎng)絡(luò)是否是wifi網(wǎng)絡(luò)
   *
   * @param context
   * @return boolean
   */
  public static boolean isWifi(Context context) {
    ConnectivityManager connectivityManager = (ConnectivityManager) context
        .getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetInfo = connectivityManager.getActiveNetworkInfo();
    if (activeNetInfo != null
        && activeNetInfo.getType() == ConnectivityManager.TYPE_WIFI) {
      return true;
    }
    return false;
  }

  /**
   * 判斷當(dāng)前網(wǎng)絡(luò)是否是2G網(wǎng)絡(luò)
   *
   * @param context
   * @return boolean
   */
  public static boolean is2G(Context context) {
    ConnectivityManager connectivityManager = (ConnectivityManager) context
        .getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetInfo = connectivityManager.getActiveNetworkInfo();
    if (activeNetInfo != null
        && (activeNetInfo.getSubtype() == TelephonyManager.NETWORK_TYPE_EDGE
        || activeNetInfo.getSubtype() == TelephonyManager.NETWORK_TYPE_GPRS || activeNetInfo
        .getSubtype() == TelephonyManager.NETWORK_TYPE_CDMA)) {
      return true;
    }
    return false;
  }

  /**
   * wifi是否打開(kāi)
   */
  public static boolean isWifiEnabled(Context context) {
    ConnectivityManager mgrConn = (ConnectivityManager) context
        .getSystemService(Context.CONNECTIVITY_SERVICE);
    TelephonyManager mgrTel = (TelephonyManager) context
        .getSystemService(Context.TELEPHONY_SERVICE);
    return ((mgrConn.getActiveNetworkInfo() != null && mgrConn
        .getActiveNetworkInfo().getState() == NetworkInfo.State.CONNECTED) || mgrTel
        .getNetworkType() == TelephonyManager.NETWORK_TYPE_UMTS);
  }

  /**
   * 判斷是否有網(wǎng)絡(luò)連接
   *
   * @param context
   * @return
   */
  public static boolean isNetworkConnected(Context context) {
    if (context != null) {
      // 獲取手機(jī)所有連接管理對(duì)象(包括對(duì)wi-fi,net等連接的管理)
      ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context
          .CONNECTIVITY_SERVICE);
      // 獲取NetworkInfo對(duì)象
      NetworkInfo networkInfo = manager.getActiveNetworkInfo();
      //判斷NetworkInfo對(duì)象是否為空
      if (networkInfo != null)
        return networkInfo.isAvailable();
    }
    return false;
  }

  /**
   * 判斷MOBILE網(wǎng)絡(luò)是否可用
   *
   * @param context
   * @param context
   * @return
   */
  public static boolean isMobileConnected(Context context) {
    if (context != null) {
      //獲取手機(jī)所有連接管理對(duì)象(包括對(duì)wi-fi,net等連接的管理)
      ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context
          .CONNECTIVITY_SERVICE);
      //獲取NetworkInfo對(duì)象
      NetworkInfo networkInfo = manager.getActiveNetworkInfo();
      //判斷NetworkInfo對(duì)象是否為空 并且類型是否為MOBILE
      if (networkInfo != null && networkInfo.getType() == ConnectivityManager.TYPE_MOBILE)
        return networkInfo.isAvailable();
    }
    return false;
  }

  /**
   * 獲取當(dāng)前網(wǎng)絡(luò)連接的類型信息
   * 原生
   *
   * @param context
   * @return
   */
  public static int getConnectedType(Context context) {
    if (context != null) {
      //獲取手機(jī)所有連接管理對(duì)象
      ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context
          .CONNECTIVITY_SERVICE);
      //獲取NetworkInfo對(duì)象
      NetworkInfo networkInfo = manager.getActiveNetworkInfo();
      if (networkInfo != null && networkInfo.isAvailable()) {
        //返回NetworkInfo的類型
        return networkInfo.getType();
      }
    }
    return -1;
  }

  /**
   * 獲取當(dāng)前的網(wǎng)絡(luò)狀態(tài) :沒(méi)有網(wǎng)絡(luò)-0:WIFI網(wǎng)絡(luò)1:4G網(wǎng)絡(luò)-4:3G網(wǎng)絡(luò)-3:2G網(wǎng)絡(luò)-2
   * 自定義
   *
   * @param context
   * @return
   */
  public static int getAPNType(Context context) {
    //結(jié)果返回值
    int netType = 0;
    //獲取手機(jī)所有連接管理對(duì)象
    ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context
        .CONNECTIVITY_SERVICE);
    //獲取NetworkInfo對(duì)象
    NetworkInfo networkInfo = manager.getActiveNetworkInfo();
    //NetworkInfo對(duì)象為空 則代表沒(méi)有網(wǎng)絡(luò)
    if (networkInfo == null) {
      return netType;
    }
    //否則 NetworkInfo對(duì)象不為空 則獲取該networkInfo的類型
    int nType = networkInfo.getType();
    if (nType == ConnectivityManager.TYPE_WIFI) {
      //WIFI
      netType = 1;
    } else if (nType == ConnectivityManager.TYPE_MOBILE) {
      int nSubType = networkInfo.getSubtype();
      TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService
          (Context.TELEPHONY_SERVICE);
      //3G  聯(lián)通的3G為UMTS或HSDPA 電信的3G為EVDO
      if (nSubType == TelephonyManager.NETWORK_TYPE_LTE
          && !telephonyManager.isNetworkRoaming()) {
        netType = 4;
      } else if (nSubType == TelephonyManager.NETWORK_TYPE_UMTS
          || nSubType == TelephonyManager.NETWORK_TYPE_HSDPA
          || nSubType == TelephonyManager.NETWORK_TYPE_EVDO_0
          && !telephonyManager.isNetworkRoaming()) {
        netType = 3;
        //2G 移動(dòng)和聯(lián)通的2G為GPRS或EGDE,電信的2G為CDMA
      } else if (nSubType == TelephonyManager.NETWORK_TYPE_GPRS
          || nSubType == TelephonyManager.NETWORK_TYPE_EDGE
          || nSubType == TelephonyManager.NETWORK_TYPE_CDMA
          && !telephonyManager.isNetworkRoaming()) {
        netType = 2;
      } else {
        netType = 2;
      }
    }
    return netType;
  }

  /**
   * 判斷GPS是否打開(kāi)
   * ACCESS_FINE_LOCATION權(quán)限
   *
   * @param context
   * @return
   */
  public static boolean isGPSEnabled(Context context) {
    //獲取手機(jī)所有連接LOCATION_SERVICE對(duì)象
    LocationManager locationManager = ((LocationManager) context.getSystemService(Context
        .LOCATION_SERVICE));
    return locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
  }

  /**
   * 獲得本機(jī)ip地址
   *
   * @return
   */
  public static String GetHostIp() {
    try {
      for (Enumeration<NetworkInterface> en = NetworkInterface
          .getNetworkInterfaces(); en.hasMoreElements(); ) {
        NetworkInterface intf = en.nextElement();
        for (Enumeration<InetAddress> ipAddr = intf.getInetAddresses(); ipAddr
            .hasMoreElements(); ) {
          InetAddress inetAddress = ipAddr.nextElement();
          if (!inetAddress.isLoopbackAddress()) {
            return inetAddress.getHostAddress();
          }
        }
      }
    } catch (SocketException ex) {
    } catch (Exception e) {
    }
    return null;
  }

  /**
   * 獲取本機(jī)串號(hào)imei
   *
   * @param context
   * @return
   */
  public static String getIMEI(Context context) {
    TelephonyManager telephonyManager = (TelephonyManager) context
        .getSystemService(Context.TELEPHONY_SERVICE);
    return telephonyManager.getDeviceId();
  }

  /***
   * 判斷是否有外網(wǎng)連接(普通方法不能判斷外網(wǎng)的網(wǎng)絡(luò)是否連接,比如連接上局域網(wǎng))
   *
   * @return
   */

  public static final boolean ping() {

    String result = null;
    try {
      String ip = "www.baidu.com";// ping 的地址,可以換成任何一種可靠的外網(wǎng)
      Process p = Runtime.getRuntime().exec("ping -c 3 -w 100 " + ip);// ping網(wǎng)址3次
      // 讀取ping的內(nèi)容,可以不加
      InputStream input = p.getInputStream();
      BufferedReader in = new BufferedReader(new InputStreamReader(input));
      StringBuffer stringBuffer = new StringBuffer();
      String content = "";
      while ((content = in.readLine()) != null) {
        stringBuffer.append(content);
      }
      Log.d("------ping-----", "result content : " + stringBuffer.toString());
      // ping的狀態(tài)
      int status = p.waitFor();
      if (status == 0) {
        result = "success";
        return true;
      } else {
        result = "failed";
      }
    } catch (IOException e) {
      result = "IOException";
    } catch (InterruptedException e) {
      result = "InterruptedException";
    } finally {
      Log.d("----result---", "result = " + result);
    }
    return false;

  }
}

源碼下載地址:https://github.com/gdutxiaoxu/FunAPP.git

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。

網(wǎng)頁(yè)題目:android監(jiān)聽(tīng)網(wǎng)絡(luò)狀態(tài)的變化及實(shí)戰(zhàn)的示例代碼
本文網(wǎng)址:http://bm7419.com/article44/gejche.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)網(wǎng)站建設(shè)移動(dòng)網(wǎng)站建設(shè)、動(dòng)態(tài)網(wǎng)站、網(wǎng)站維護(hù)、微信小程序、自適應(yīng)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

小程序開(kāi)發(fā)