如何在Android上获得网络状态变化?

时间:2016-11-21 05:21:59

标签: android android-connectivitymanager networkinfo

我有" CONNECTIVITY_CHANGE"的广播接收器。当我用这个打印额外的时候:

intent.getExtras().toString() 

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

  1. WIFI DISCONNECTED
  2. MOBILE CONNECTED
  3. 然而,当我尝试使用

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

    额外注意:

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

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

6 个答案:

答案 0 :(得分:4)

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

首先,我们需要以下权限才能访问网络状态。将以下权限添加到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都会触发这些意图并调用我们的广播接收器。

这就是运行你的Code.Hope这符合你的目的!!

答案 1 :(得分: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;
        }
    }


}

答案 2 :(得分:1)

确定您是否有互联网连接

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。

答案 3 :(得分: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;
    }

答案 4 :(得分: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;
    }
}
}

答案 5 :(得分: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; 
    } 
}