¿Cuándo se transmite la intención ACTION_DEVICE_STORAGE_LOW?

En mi aplicación, he registrado un receptor de difusión para recibir la intención del sistema ACTION_DEVICE_STORAGE_LOW. Esperaba que esto fuera transmitido siempre que el teléfono tuviera memoria interna baja. Por lo tanto, he descargado algunas aplicaciones adicionales (mi teléfono tiene una memoria interna muy pequeña) que causó el sistema operativo para mostrar la notificación de que la memoria del sistema es baja. El teléfono tenía 10 – 15 MB restantes. Sin embargo, mi receptor de la difusión nunca recibió esa intención. Sin embargo, la notificación del sistema permanece en la barra de notificación y no puedo navegar por Internet debido a la baja memoria interna.

¿Debería transmitirse esta intención siempre que se muestre la baja notificación de memoria interna? ¿O hay algún umbral aún más bajo de la memoria que enviará esta emisión que no he golpeado aún en mi teléfono? En la documentación sólo dice "Acción de difusión: una emisión pegajosa que indica que hay poca condición de memoria en el dispositivo". Ya que en realidad no define "condición de memoria baja", no sé si estoy haciendo algo mal, o si simplemente no han golpeado esa condición todavía.

Aquí está el código para mi BroadCastReceiver:

public class MemoryBroadcastReceiver extends BroadcastReceiver { public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (action.equals(Intent.ACTION_MEDIA_MOUNTED)) { Log.isExternalStorageProblem = false; Log.clearNotification(Log.externalMemoryNotificationID); } if (action.equals(Intent.ACTION_DEVICE_STORAGE_OK)) { Log.isInternalStorageLow = false; Log.clearNotification(Log.internalMemoryNotificationID); } if (action.equals(Intent.ACTION_DEVICE_STORAGE_LOW)) { Log.isInternalStorageLow = true; Log.displayMemoryNotification("Internal Storage Low", "The internal storage is low, Please fix this.", "Please clear cache and/or uninstall apps.", Log.internalMemoryNotificationID); } } } 

Tengo un servicio que inicializa el receptor, agrega el filtro de intento y lo registra (entre otras cosas):

 private MemoryBroadcastReceiver memoryBroadcastReciever = new MemoryBroadcastReceiver(); public void registerBroadcastReceiver() { IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_DEVICE_STORAGE_OK); filter.addAction(Intent.ACTION_MEDIA_MOUNTED); filter.addAction(Intent.ACTION_DEVICE_STORAGE_LOW); filter.addDataScheme("file"); this.getApplicationContext().registerReceiver(memoryBroadcastReciever, filter); } @Override public void onCreate() { registerBroadcastReceiver(); } 

TL, DR

Mientras el fabricante del dispositivo no cambie la configuración predeterminada, la intención se transmitirá cuando la memoria libre alcance el 10% de la memoria interna del dispositivo.

Versión larga

Me saltó a través del código fuente de Android para que la intención y llegué a una clase llamada DeviceStorageMonitorService

(Ubicado en: frameworks / base / services / java / com / android / server / DeviceStorageMonitorService.java )

Desde el javadoc:

Esta clase implementa un servicio para monitorear la cantidad de disco
Espacio de almacenamiento en el dispositivo. Si el almacenamiento gratuito en el dispositivo es menor
Que un valor de umbral sintonizable (un parámetro de configuración segura, predeterminado 10%), se muestra una notificación de memoria baja para alertar al usuario. Si el usuario hace clic en la notificación de memoria baja se lanza la aplicación Application Manager para permitir al usuario espacio de almacenamiento libre.

Así que ahí lo tienes. Mientras el fabricante del dispositivo no cambie eso, estará en el 10%.

Comprobando el código fuente un poco más, el DeviceStorageMonitor envía una difusión pegajosa: (línea 354)

 mContext.sendStickyBroadcast(mStorageLowIntent); 

Lo que significa que incluso después de la emisión está terminado, puede capturar los datos mediante el registro de un receptor en esa intención.

De Desarrollador de Android – Contexto :

Realizar un sendBroadcast (intención) que es "pegajoso", es decir, la intención que está enviando permanece después de que la transmisión se ha completado, para que otros puedan recuperar rápidamente los datos a través del valor de retorno de registerReceiver (BroadcastReceiver, IntentFilter). En otras formas, esto se comporta igual que sendBroadcast (Intención).

espero que esto ayude.

  • Android - cómo anular el registro de un receptor creado en el manifiesto?
  • La detección de cambios de estado de la red Android tarda tiempo
  • Inicio del servicio desde BroadcastReceiver
  • ACTION_MY_PACKAGE_REPLACED no recibido
  • Receptor de difusión no funciona para SMS
  • Cómo crear una intención pendiente dentro de una clase BroadcastReceiver?
  • Broadcast Receivers - WhatsApp y servicios similares
  • Crear notificación con BroadcastReceiver
  • Android <receptor> - BroadcastReceiver no se llama
  • Android BroadcastReceiver en el inicio - sigue funcionando cuando la actividad está en segundo plano
  • Receptor de alarma y el manifiesto de Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.