如何在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上获取网络状态变化? [复制]的主要内容,如果未能解决你的问题,请参考以下文章