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?
- AsyncSocket en java?
- ¿Cuál es el tiempo de espera predeterminado de java.net.Socket en android?
- Captura de la cámara IP Stream y publicar en mi sitio web
- Emulador de Android: ¿Cómo supervisar el tráfico de red?
- Cómo configurar una dirección IP estática, máscara de red, puerta de enlace mediante programación en Android 3.xo 4.x
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); } }
- ¿Podemos conectarnos al iPhone desde un dispositivo Android aunque no esté en la misma red?
- Recuperar mediante programación los datos de uso de la red de etiquetas en Android
- Cambiar el operador de red con una aplicación para Android
- Compruebe la disponibilidad de la red wifi oculta
- Acceso dev machine localhost a través de usb
- Tcp conexión otro dispositivo android, basado en # teléfono en lugar de IP?
- Cómo detectar todos los dispositivos conectados en una red WiFi desde la aplicación para Android
- Cómo especificar la red wifi con NetworkRequest.Builder (). SetNetworkSpecifier (string)
- ¿Es OAuth en un teléfono móvil usando un servidor proxy demasiado problema?
- Reproducción de vídeo nativa de Android con canal alfa