【问题标题】:How to get network state change on android? [duplicate]如何在android上获取网络状态变化? [复制]
【发布时间】:2017-04-04 10:34:45
【问题描述】:

我有“CONNECTIVITY_CHANGE”的广播接收器。当我使用此打印额外内容时:

intent.getExtras().toString() 

我可以看到,如果我禁用 WIFI,我会收到 2 次网络更改。

  1. WIFI 断开
  2. 移动连接

但是,当我尝试使用时

NetworkInfo networkInfo = intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);

据说,此 API 已被弃用。之后,我尝试使用这个

int networkType = intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_TYPE);
NetworkInfo networkInfo = connectivityManager.getNetworkInfo(networkType);

不过,getNetworkInfo 也已被弃用。

他们给我的唯一选择是使用 getActiveNetworkInfo 或 getActiveNetwork。

如果我使用它,我会得到 2 个广播,它会给我相同的网络信息。

有没有更好的方法来处理 Android 中的网络状态?

额外说明:

感谢您的快速回复,但我不是在寻找一种方法来检查我是否有互联网连接。

我需要知道哪个网络已断开和连接。网络状态变化正是我要寻找的。​​p>

【问题讨论】:

  • 您可以使用connectivity manager compact 来获取网络信息
  • 检查下面的readyandroid给出的答案。它可能会帮助你。
  • 我知道是否在线检查网络。但这不是我要找的。 WIFI转3G网络时需要执行代码,如果使用的话会执行两次代码。
  • @Adrian 请检查this 您可以使用 getNetworkInfoFromBroadcast 方法执行该操作
  • @SaravInfern 谢谢。这就是我一直在寻找的。如果你把你的答案,我会把它标记为正确答案

标签: android android-connectivitymanager networkinfo


【解决方案1】:

这里有一个简单的代码 sn-p,它可以帮助您识别用户在她的设备上的互联网连接类型。

首先我们需要以下权限才能访问网络状态。向您的 AndroidManifest.xml 文件添加以下权限。

访问网络状态所需的权限:

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

现在检查以下实用程序类 NetworkUtil。它具有 getConnectivityStatus 方法,该方法根据当前网络连接返回一个 int 常量。如果启用了 wifi,此方法将返回 TYPE_WIFI。同样对于移动数据网络,返回 TYPE_MOBILE。你明白了!

还有方法 getConnectivityStatusString 将当前网络状态作为更易读的字符串返回。

创建一个类 NetworkUtil.java 并粘贴以下代码:

import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;

public class NetworkUtil {

    public static int TYPE_WIFI = 1;
    public static int TYPE_MOBILE = 2;
    public static int TYPE_NOT_CONNECTED = 0;


    public static int getConnectivityStatus(Context context) {
        ConnectivityManager cm = (ConnectivityManager) context
                .getSystemService(Context.CONNECTIVITY_SERVICE);

        NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
        if (null != activeNetwork) {
            if(activeNetwork.getType() == ConnectivityManager.TYPE_WIFI)
                return TYPE_WIFI;

            if(activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE)
                return TYPE_MOBILE;
        } 
        return TYPE_NOT_CONNECTED;
    }

    public static String getConnectivityStatusString(Context context) {
        int conn = NetworkUtil.getConnectivityStatus(context);
        String status = null;
        if (conn == NetworkUtil.TYPE_WIFI) {
            status = "Wifi enabled";
        } else if (conn == NetworkUtil.TYPE_MOBILE) {
            status = "Mobile data enabled";
        } else if (conn == NetworkUtil.TYPE_NOT_CONNECTED) {
            status = "Not connected to Internet";
        }
        return status;
    }
}

您可以在您的 android 应用程序中使用此实用程序类随时检查设备的网络状态。

广播接收器处理网络状态的变化

您可以通过创建自己的广播接收器轻松处理网络状态的变化。以下是我们处理网络变化的广播接收器类。

检查 onReceive() 方法。当网络状态发生变化时,将调用此方法。在这里,我们只是创建一个 Toast 消息并显示当前网络状态。您可以在此处编写自定义代码来处理连接状态的更改。

创建一个类 NetworkChangeReceiver.java 并粘贴以下代码:

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;

public class NetworkChangeReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(final Context context, final Intent intent) {

        String status = NetworkUtil.getConnectivityStatusString(context);

        Toast.makeText(context, status, Toast.LENGTH_LONG).show();
    }
}

一旦我们定义了我们的广播接收器,我们需要在 AndroidMenifest.xml 文件中定义它。将以下内容添加到您的清单文件中。

<application  ...>
     ...
        <receiver
            android:name="YOUR PACKAGE NAME"
            android:label="NetworkChangeReceiver" >
            <intent-filter>
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
                <action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
            </intent-filter>
        </receiver>
      ...
</application>

我们在清单文件中定义了广播接收器类。我们还定义了两个意图 CONNECTIVITY_CHANGE 和 WIFI_STATE_CHANGED。因此,这将为给定的意图注册我们的接收器。每当网络状态发生变化时,android 都会触发这些意图并调用我们的广播接收器。

就是这样运行你的代码。希望这能达到你的目的!

【讨论】:

    【解决方案2】:

    使用以下代码检查网络连接当前状态

     public class NetworkStateReceiver extends BroadcastReceiver {
    
        Context context;
    
    
        @Override
        public void onReceive(Context context, Intent intent) {
            // TODO Auto-generated method stub
            this.context = context;
    
            Log.d("app","Network connectivity change==>"+isOnline());
    
            if(isOnline()==true)
            {
                //Internet Connected!
    
            }
            else
            {
                // No Internet!
    
            }
    
    
    
        }
    
        protected boolean isOnline() {
            ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo netInfo = cm.getActiveNetworkInfo();
            if (netInfo != null && netInfo.isConnected()) {
                return true;
            } else {
                return false;
            }
        }
    
    
    }
    

    【讨论】:

      【解决方案3】:

      确定您是否有互联网连接

      ConnectivityManager cm =
              (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
      
      NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
      boolean isConnected = activeNetwork != null &&
                            activeNetwork.isConnectedOrConnecting();
      

      确定您的互联网连接类型

      可以通过移动数据、WiMAX、Wi-Fi 和以太网连接来提供设备连接。通过查询活动网络的类型,如下图所示,您可以根据可用带宽更改刷新率。

      boolean isWiFi = activeNetwork.getType() == ConnectivityManager.TYPE_WIFI;
      

      监控连接变化

      面向 Android 7.0(API 级别 24)的应用不会接收 CONNECTIVITY_ACTION 广播,即使它们在清单中注册了这些广播。正在运行的应用仍然可以通过向 Context.registerReceiver() 注册 BroadcastReceiver 在其主线程上侦听 CONNECTIVITY_CHANGE。

      【讨论】:

        【解决方案4】:

        您可以使用它来检查互联网是否可用:

        /**
             * Check Internet connection is available or not
             *
             * @param context current context
             *                Use {@link #checkInternetConnection(Context context)}
             * @return {@link Boolean}
             */
            public static boolean checkInternetConnection(Context context) {
                ConnectivityManager _connManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        
                boolean _isConnected = false;
                NetworkInfo _activeNetwork = _connManager.getActiveNetworkInfo();
                if (_activeNetwork != null) {
                    _isConnected = _activeNetwork.isConnectedOrConnecting();
                }
        
                return _isConnected;
            }
        

        【讨论】:

          【解决方案5】:

          使用广播接收器:

          清单条目:

          <receiver android:name=".your.namepackage.here.ConnectivityReceiver">
              <intent-filter>
                  <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
              </intent-filter>
          </receiver>
          

          接收器类:

          public class ConnectivityReceiver extends BroadcastReceiver{
          
          @Override
          public void onReceive(Context context, Intent intent) {
              final String action = intent.getAction();
              switch (action) {
                  case ConnectivityManager.CONNECTIVITY_ACTION:
          
                      if(isConnect()) //your logic to check netwrok
              {
                          //do action here
                      }
                  break;
              }
          }
          }
          

          【讨论】:

            【解决方案6】:

            试试这个代码

            public static boolean isActiveNetworkMetered(Context context) {
                ConnectivityManager manager = getConnectivityManager(context);
                if (manager == null)
                    return false; 
            
                ConnectivityManagerCompat compat = new ConnectivityManagerCompat();
                return compat.isActiveNetworkMetered(manager);
            } 
            
            public static String getActiveNetworkName(Context context) {
                try { 
                    NetworkInfo info = getActivieNetworkInfo(context);
                    String typeName = info.getTypeName().toLowerCase();
                    if (typeName.equals("wifi")) {
                        return typeName;
                    } else { 
                        String extraInfoName = info.getExtraInfo().toLowerCase();
                        if (!TextUtils.isEmpty(extraInfoName))
                            return extraInfoName;
                    } 
                    return typeName;
                } catch (Exception e) {
                    return null; 
                } 
            } 
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-03-08
              • 2015-01-18
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多