如何在android上获取网络状态变化? [复制]

Posted

技术标签:

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

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

intent.getExtras().toString() 

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

    WIFI 断开 移动连接

但是,当我尝试使用时

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 谢谢。这就是我一直在寻找的。如果你把你的答案,我会把它标记为正确答案 【参考方案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; 
     
 

【讨论】:

以上是关于如何在android上获取网络状态变化? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何显示网络变化状态的对话?

Android如何监听GPS状态变化?

【微信小程序】获取当前网络状态,监测网络变化

Android:如何在 android 4.2 上折叠状态栏? [复制]

android 监听网络状态的变化及实战

android怎么设置显示监听