尝试在我的应用中检查互联网连接。 我的清单有一个代码:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<receiver android:name=".MyReceiver" >
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
</intent-filter>
</receiver>
还有一个句柄类:
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if(intent.getAction() != null && intent.getAction().equals("android.net.conn.CONNECTIVITY_CHANGE"));
{
Log.d("myLogs", "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("myLogs", "Network " + ni.getTypeName() + " connected");
}
}
if (intent.getExtras().getBoolean(
ConnectivityManager.EXTRA_NO_CONNECTIVITY, Boolean.FALSE)) {
Log.d("myLogs", "There's no network connectivity");
}
}
}
}
在我的Logcat中我得到一张如下照片:
04-11 23:24:48.021: D/myLogs(10261): Network connectivity change
04-11 23:24:48.021: I/myLogs(10261): Network WIFI connected
04-11 23:24:48.202: D/myLogs(10261): Network connectivity change
04-11 23:24:48.202: I/myLogs(10261): Network WIFI connected
所以,接收者叫了两次。为什么?所有类型的连接都存在一些问题。
答案 0 :(得分:3)
假设你在连接wifi时得到连接的消息,我猜第一个是正确的,另外两个只是因为某种原因的回声。
要知道消息已被调用,你可以有一个静态布尔值,它在connect和disconnect之间切换,只在你收到一个连接并且boolean为true时调用你的子例程。类似的东西:
public class ConnectionChangeReceiver extends BroadcastReceiver {
private static boolean firstConnect = true;
@Override
public void onReceive(Context context, Intent intent) {
final ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
final NetworkInfo activeNetInfo = connectivityManager.getActiveNetworkInfo();
if (activeNetInfo != null) {
if(firstConnect) {
// do subroutines here
firstConnect = false;
}
}
else {
firstConnect= true;
}
}
}
请注意
您需要注意两件事。首先 - 在某处存储“firstConnect”,例如在共享首选项中存储,其次是当您从3G更改为WiFi时,没有实际断开连接,因此最好分别处理3G和WiFi事件
答案 1 :(得分:1)
您可能还需要通过检查接收方中的isStickyBroadcast来检查收到的意图是否是Sticky事件之一。如果这是真的,那么你可以忽略它,然后继续。一旦接收者注册,你就会收到粘性广播。
答案 2 :(得分:0)
在文档中解释:
&#34; 对设备连接的更改可能非常频繁 - 每次在移动数据和Wi-Fi之间切换时都会触发此广播。因此,只有在您之前暂停更新或下载才能恢复此广播时,才能监控此广播。在开始更新之前,通常只需检查Internet连接即可,如果没有,则暂停进一步更新,直到连接恢复为止。&#34;
编辑: 忘了添加...一个广播接收器只知道设备是否连接是一个hoverhead。来自相同的文档:
ConnectivityManager cm = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
boolean isConnected = activeNetwork != null && activeNetwork.isConnectedOrConnecting();
boolean isWiFi = activeNetwork.getType() == ConnectivityManager.TYPE_WIFI;