互联网连接和广播接收器
Internet connectivity and Broadcast Receiver
我正在开发需要检查互联网连接是否稳定的应用程序。如果 Internet 连接不稳定,那么我们需要调用我们的 Web 服务,否则我们不会点击它。
为此,我在 Java 中写了以下广播接收器,因为我读到 android 现在希望开发人员在 Java class 中注册此接收器。
所以这里是
private class NetworkChangeBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
callMyWebService();
}
@Override
protected void onResume() {
super.onResume();
if (!isNetworkBroadcastReceiverRegistered) {
if (NetworkChangeBR == null) {
NetworkChangeBR = new NetworkChangeBroadcastReceiver();
registerReceiver(NetworkChangeBR, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
isNetworkBroadcastReceiverRegistered = true;
}
}
acquireWakeLock(mCustomSharedPreferences.getBoolean(CustomSharedPreferences.KEEP_SCREEN_ON_ALL_THE_TIME, false));
}
@Override
protected void onPause() {
super.onPause();
if (isNetworkBroadcastReceiverRegistered) {
unregisterReceiver(NetworkChangeBR);
NetworkChangeBR = null;
isNetworkBroadcastReceiverRegistered = false;
}
}
问题: 但是我面临以下问题
- 当我第一次在我的 onResume 方法中注册接收器时,它会自动触发,在 return 中调用我的网络服务,因为实际上没有互联网变化发生
- 第二,这只是检查无线连接和断开连接,但我想在无线最终连接到互联网时获得回调,当它发生时,广播必须向我的应用程序抛出回调
请在这两种情况下帮助我。
你的 BroadcastReceiver
立即被触发的原因是广播 Intent
ConnectivityManager.CONNECTIVITY_ACTION
是 "sticky" 广播。这允许应用程序注册并立即接收此类型的最后一个广播事件(以便它们可以确定当前的连接情况)。如果此 "sticky" 广播给您带来问题,只需在 onReceive()
中检查并忽略它:
// Ignore the sticky broadcast of the initial state
if (isInitialStickyBroadcast()) {
return;
}
您的 BroadcastReceiver
获取的 Intent
中有大量数据作为 "extras" 传递。例如,您可以判断事件是 CONNECT 还是 DISCONNECT 事件等。查看 ConnectivityManager
上的文档以确定发送了什么 "extras" 以及如何使用它们。
我正在开发需要检查互联网连接是否稳定的应用程序。如果 Internet 连接不稳定,那么我们需要调用我们的 Web 服务,否则我们不会点击它。
为此,我在 Java 中写了以下广播接收器,因为我读到 android 现在希望开发人员在 Java class 中注册此接收器。
所以这里是
private class NetworkChangeBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
callMyWebService();
}
@Override
protected void onResume() {
super.onResume();
if (!isNetworkBroadcastReceiverRegistered) {
if (NetworkChangeBR == null) {
NetworkChangeBR = new NetworkChangeBroadcastReceiver();
registerReceiver(NetworkChangeBR, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
isNetworkBroadcastReceiverRegistered = true;
}
}
acquireWakeLock(mCustomSharedPreferences.getBoolean(CustomSharedPreferences.KEEP_SCREEN_ON_ALL_THE_TIME, false));
}
@Override
protected void onPause() {
super.onPause();
if (isNetworkBroadcastReceiverRegistered) {
unregisterReceiver(NetworkChangeBR);
NetworkChangeBR = null;
isNetworkBroadcastReceiverRegistered = false;
}
}
问题: 但是我面临以下问题
- 当我第一次在我的 onResume 方法中注册接收器时,它会自动触发,在 return 中调用我的网络服务,因为实际上没有互联网变化发生
- 第二,这只是检查无线连接和断开连接,但我想在无线最终连接到互联网时获得回调,当它发生时,广播必须向我的应用程序抛出回调
请在这两种情况下帮助我。
你的 BroadcastReceiver
立即被触发的原因是广播 Intent
ConnectivityManager.CONNECTIVITY_ACTION
是 "sticky" 广播。这允许应用程序注册并立即接收此类型的最后一个广播事件(以便它们可以确定当前的连接情况)。如果此 "sticky" 广播给您带来问题,只需在 onReceive()
中检查并忽略它:
// Ignore the sticky broadcast of the initial state
if (isInitialStickyBroadcast()) {
return;
}
您的 BroadcastReceiver
获取的 Intent
中有大量数据作为 "extras" 传递。例如,您可以判断事件是 CONNECT 还是 DISCONNECT 事件等。查看 ConnectivityManager
上的文档以确定发送了什么 "extras" 以及如何使用它们。