El modo de ahorro de energía no causa conexión de red cuando la aplicación vuelve del fondo

Utilizo un patrón de observador para supervisar cuando hay un cambio en la conectividad de red. El problema que estoy experimentando es que si el modo de ahorro de energía está habilitado en cualquier dispositivo, volver del fondo al primer plano de mi aplicación disparará "sin red" momentáneamente al comprobar la conectividad. Debido a la naturaleza del patrón de observador, este cambio abrirá mi cuadro de diálogo sin conexión, aunque milisegundos más tarde se restaure una conexión.

La señal de conexión sigue siendo fuerte cuando se regresa a la aplicación desde el fondo, pero por alguna razón el modo de ahorro de energía engaña al sistema para pensar que no hay conexión cuando hay. ¿Cómo puedo controlar esto? ¿Hay algún tipo de forma de ignorar la comprobación de la conectividad si el modo de ahorro de energía está activo?

Aquí está mi clase de observador de red. Registro receptores en toda mi aplicación y utilizo el ciclo de vida de la actividad de la aplicación para determinar cuándo debo escuchar los cambios en la red y cuándo no. ¡Gracias por adelantado!

public class NetworkReceiver extends BroadcastReceiver { private static final String TAG = NetworkReceiver.class.getSimpleName(); private static final List<NetworkStatusObserver> mObserverList = new ArrayList<>(); private static boolean isNetworkConnected = true; @Override public void onReceive(Context context, Intent intent) { Logger.i(TAG, "onReceive() broadcast"); boolean disconnected = intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false); boolean isNetworkConnectedCurrent; if (disconnected) { isNetworkConnectedCurrent = false; } else { NetworkInfo networkInfo; if (Build.VERSION.SDK_INT < 17) { networkInfo = intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO); } else { ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); networkInfo = cm.getActiveNetworkInfo(); } isNetworkConnectedCurrent = !FrameworkUtils.checkIfNull(networkInfo) && networkInfo.isConnectedOrConnecting(); } if (isNetworkConnectedCurrent != isNetworkConnected) { isNetworkConnected = isNetworkConnectedCurrent; Logger.d(TAG, "NetworkStatus.onReceive - isNetworkConnected: " + isNetworkConnected); notifyObservers(isNetworkConnected); } } /** * Lets all {@link NetworkStatusObserver}s know if the DEVICE is connected to a network. * * @param isNetworkConnectedCurrent */ private void notifyObservers(Boolean isNetworkConnectedCurrent) { for (NetworkStatusObserver networkStatusObserver : mObserverList) { networkStatusObserver.notifyConnectionChange(isNetworkConnectedCurrent); } } /** * Add observer to observer list * * @param observer */ public void addObserver(NetworkStatusObserver observer) { mObserverList.add(observer); } /** * Remove observer from observer list * * @param observer */ public void removeObserver(NetworkStatusObserver observer) { mObserverList.remove(observer); } /** * Retrieve observer list size * * @return */ public int getObserverSize() { return mObserverList.size(); } /** * Check if receiver is added to observer list * * @param observer * @return */ public boolean contains(NetworkStatusObserver observer) { return mObserverList.contains(observer); } /** * Method is used to print observer list */ public void printObserverList() { Logger.i(TAG, "===== PRINT OBSERVER LIST ===== "); for (int i = 0; i < mObserverList.size(); i++) { Logger.i(TAG, String.format("item(%d): %s", i, mObserverList.get(i).toString())); } } /** * Interface for monitoring network status change */ public interface NetworkStatusObserver { void notifyConnectionChange(boolean isConnected); } } 

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.