1

我有“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 中的网络状态?

额外说明:

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

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

4

6 回答 6

8

这是一个简单的代码片段,可帮助您识别用户在其设备上的互联网连接类型。

首先,我们需要以下权限才能访问网络状态。向您的 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();
    }
}

一旦我们定义了我们的 BroadcastReceiver,我们需要在 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 都会触发这些意图,并且我们的广播接收器将被调用。

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

于 2016-11-21T06:19:39.473 回答
3

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

 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;
        }
    }


}
于 2016-11-21T05:36:06.307 回答
1

确定您是否有 Internet 连接

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

NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
boolean isConnected = activeNetwork != null &&
                      activeNetwork.isConnectedOrConnecting();

确定 Internet 连接的类型

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

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

监控连接变化

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

于 2016-11-21T05:41:16.217 回答
0

试试这个代码

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; 
    } 
} 
于 2016-11-21T06:28:20.807 回答
0

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

/**
     * 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;
    }
于 2016-11-21T05:29:03.227 回答
0

使用广播接收器:

清单条目:

<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;
    }
}
}
于 2016-11-21T06:10:33.823 回答