我正在尝试在我的Android应用中检测网络状态更改。我按照那个问题回答了问题:Check INTENT internet connection
这是有效的,但广播接收者需要时间来检测变化。当我打开或关闭wifi时,大约10秒后调用onReceive()方法。为什么花这么多时间?有人可以帮忙吗?
由于
这是我的代码:
public class NetworkStateReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.d("app", "Network connectivity change");
if (intent.getExtras() != null) {
NetworkInfo ni = (NetworkInfo) intent.getExtras().get(
ConnectivityManager.EXTRA_NETWORK_INFO);
if (ni != null && ni.getState() == NetworkInfo.State.CONNECTED) {
Log.i("app", "Network " + ni.getTypeName() + " connected");
Toast.makeText(context, "CONNECTED", Toast.LENGTH_LONG).show();
} else if (intent.getBooleanExtra(
ConnectivityManager.EXTRA_NO_CONNECTIVITY, Boolean.FALSE)) {
Toast.makeText(context, "DISCONNECTED", Toast.LENGTH_LONG).show();
Log.d("app", "There's no network connectivity");
}
}
}
}
并在我的Manifest的应用程序标签中:
<receiver android:name="com.mypackage.NetworkStateReceiver" >
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
</receiver>
答案 0 :(得分:6)
我找到了解决方案。
我没有扩展BroadcastReceiver类并创建NetworkStateChangeReceiver,而是在我的活动上创建了一个broadcastreceiver并在那里注册了它。现在它可以工作,并立即触发onReceive()方法。
答案 1 :(得分:0)
public static boolean isInternetAvailable(Context context) {
boolean isConnection = false;
ConnectivityManager connectivityManager = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
if (connectivityManager != null) {
NetworkInfo[] info = connectivityManager.getAllNetworkInfo();
if (info != null) {
for (int index = 0; index < info.length; index++) {
if (info[index].getState() == NetworkInfo.State.CONNECTED) {
isConnection = true;
break;
}
}
}
}
return isConnection;
}
答案 2 :(得分:0)
我的应用程序中有类似的代码来检测是否存在连接,并提示用户连接状态更改。
在我的应用程序中,它会在一秒钟内收到断开连接的连接更改,但是当你打开WiFi时,大约需要7秒才能收到连接状态的变化。
然而,我收到的状态更改与Android发出的声音“连接到Wi-Fi网络[您的网络名称]”完全相同。
您可能会在连接到网络时同时收到更改,而不是在您按下Wi-Fi切换按钮以打开它时。
是否有特殊原因需要从按下切换开关时的即时反馈?