¿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.
- Anular el registro de Android Broadcast Receiver en onReceive lanza "Receptor no registrado"
- Haga clic en la notificación GCM para no abrir la actividad deseada en Android Kitkat
- Los datos de referencias de Android Market no se están poblando
- El lanzamiento de una actividad de un receptor de emisión que escucha la llamada saliente
- Receptor de difusión no funciona para SMS
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(); }
- Cómo cancelar el registro de BroadcastReceiver
- Android.net.wifi.WIFI_STATE_CHANGED no se está transmitiendo
- ANR Difusión de Intención {act = android.intent.action.SCREEN_OFF flg = 0x50000010}
- ¿Por qué llamar a setResult en BroadcastReceiver?
- No se puede detectar cuando se responde la llamada saliente en Android
- Cómo actualizar la interfaz de usuario en un BroadcastReceiver
- Tratando de tener un Receptor Broadcast sin filtro
- El receptor de difusión funciona de forma diferente en diferentes versiones de Android (4.1.1 y 4.2.2)
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.