我有" CONNECTIVITY_CHANGE"的广播接收器。当我用这个打印额外的时候:
intent.getExtras().toString()
我可以看到,如果我禁用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中的网络状态?
额外注意:
感谢您的快速回复,但我不是在寻找一种方法来检查我是否有互联网连接。
我需要知道哪个网络已断开连接。我正在寻找网络状态变化。
答案 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;
}
}