2011-11-14 8 views
10

En mi aplicación, he registrado un receptor de difusión para recibir el intento del sistema ACTION_DEVICE_STORAGE_LOW. Esperaba que se emitiera cuando el teléfono tenía poca memoria interna. Entonces, descargué algunas aplicaciones adicionales (mi teléfono tiene una memoria interna muy pequeña) lo que hizo que el sistema operativo mostrara 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 emisión nunca recibió esa intención. Sin embargo, la notificación del sistema permanece en la barra de notificaciones y no puedo navegar por Internet debido a la poca memoria interna.¿Cuándo se transmite la intención ACTION_DEVICE_STORAGE_LOW?

¿Debería emitirse este intento siempre que se muestre la notificación de memoria interna baja? ¿O hay algún umbral de memoria aún más bajo que envíe esta transmisión que todavía no he alcanzado en mi teléfono? En la documentación, solo dice "Acción de difusión: una emisión fija que indica una condición de memoria baja en el dispositivo". Dado que en realidad no define "condiciones de baja memoria", no sé si estoy haciendo algo mal o si simplemente aún no he alcanzado esa condición.

Este es 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, añade el filtro de la intención y la 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(); 
} 
+0

por favor publique su código aquí –

+0

Acabo de publicar mi código. La respuesta de DallaRosa es genial y creo que tiene razón sobre la transmisión que se envía al 10% de almacenamiento interno restante, pero aún no he podido recibir la transmisión. – mattgmg1990

+2

En caso de que alguien esté interesado, encontré la respuesta a mi problema al recibir la transmisión. Resulta que esta intención coincide con el esquema de datos predeterminado (es decir, no agrega ningún esquema de datos al filtro de intención). Luego coincide con la acción sin ningún problema. Creé dos filtros para que coincidan con las tres acciones que estaba planeando recibir porque ACTION_MEDIA_MOUNTED necesita agregar el datascheme del archivo. – mattgmg1990

Respuesta

20

TL ; DR

Siempre que el fabricante del dispositivo no cambie la configuración predeterminada, la intención se transmitirá cuando la m emory alcanza el 10% de la memoria interna del dispositivo.

Versión larga

I grepped a través del código fuente de Android para ese propósito y llegué a una clase llamada DeviceStorageMonitorService

(que se encuentra en: marcos/base/servicios/java/com /android/server/DeviceStorageMonitorService.java)

Desde el javadoc:

Esta clase implementa un servicio para supervisar la cantidad de espacio de almacenamiento de disco
en el dispositivo. Si el almacenamiento gratuito en el dispositivo es menor que
que un valor de umbral ajustable (un parámetro de configuración segura, por defecto 10%) se muestra una notificación de poca memoria para alertar al usuario. Si el usuario hace clic en la notificación de poca memoria, se inicia la aplicación Administrador de aplicación para dejar espacio libre de almacenamiento al usuario .

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

El registro de salida el código fuente de un poco más, el DeviceStorageMonitor envía una emisión persistente: (línea 354)

mContext.sendStickyBroadcast(mStorageLowIntent); 

Lo que significa que, incluso después de la emisión está terminado se puede coger los datos mediante el registro de un receptor en ese intento.

de Android Developer - Context:

Realizar una sendBroadcast (Intención) que es "pegajosa", es decir las estancias Intención va a enviar alrededor después de la emisión es completa, para que otros pueden recuperar rápidamente los datos a través el valor de retorno de registerReceiver (BroadcastReceiver, IntentFilter). En todos los demás aspectos, esto se comporta de la misma manera que sendBroadcast (Intención).

Espero que esto ayude.

+1

¡Muchas gracias! He aceptado tu respuesta porque has respondido absolutamente la pregunta que hice. Definitivamente tiene razón acerca de la notificación/transmisión que se envía cuando el teléfono tiene un 10% de almacenamiento interno disponible. Lo he verificado. Sin embargo, todavía no estoy seguro de por qué mi aplicación no recibe el intento como se esperaba. Trataré de utilizar el hecho de que la transmisión es permanente al verificar periódicamente el valor que mencionaste, pero también me gustaría recibir la transmisión cuando sucede, así puedo presentar mi propia notificación al usuario. – mattgmg1990

Cuestiones relacionadas