如何在Android上获取网络状态更改?

Adr*_*ian 0 android networkinfo android-connectivitymanager

我已经为“ CONNECTIVITY_CHANGE”广播了接收器。当我用这个打印多余的东西时:

intent.getExtras().toString() 
Run Code Online (Sandbox Code Playgroud)

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

  1. WIFI已断开
  2. 移动连接

但是,当我尝试使用

NetworkInfo networkInfo = intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);
Run Code Online (Sandbox Code Playgroud)

它说,此API已被弃用。在那之后,我试图用这个

int networkType = intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_TYPE);
NetworkInfo networkInfo = connectivityManager.getNetworkInfo(networkType);
Run Code Online (Sandbox Code Playgroud)

但是,getNetworkInfo也已被弃用。

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

如果使用它,我将获得2次广播,这将给我相同的网络信息。

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

特别提示:

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

我需要知道哪个网络已断开连接。我正在寻找网络状态更改。

小智 6

这是一个简单的代码段,可帮助您确定用户在其设备上具有哪种互联网连接。

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

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

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
Run Code Online (Sandbox Code Playgroud)

现在检查以下实用程序类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;
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以随时在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();
    }
}
Run Code Online (Sandbox Code Playgroud)

定义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>
Run Code Online (Sandbox Code Playgroud)

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

就是运行您的代码了。希望这可以达到您的目的!