2011-10-25 11 views
16

Tengo un receptor de difusión registrado programáticamente en una actividad. Responde al intento PACKAGE_REMOVED, que se activa cuando se elimina un paquete.Receptor de difusión y actividad en pausa

El problema es que no recibe este mensaje. Creo que esto se debe a que la intención se dispara cuando dejo la actividad y paso a otra actividad para desinstalar una aplicación, por lo que la actividad original está en pausa. ¿Podría ser que una actividad pausada (donde el receptor no está no registrado en) también pause el receptor?

Respuesta

36

Cuando registra un receptor de difusión programáticamente en una actividad, NO obtendrá transmisiones cuando la actividad esté en pausa. Los BroadcastReceiver docs no son tan claros como podrían ser en este punto. Recomiendan anular el registro en OnPause únicamente para reducir la sobrecarga del sistema.

Si desea recibir eventos incluso cuando su actividad no está en primer plano, registre el receptor en su manifiesto utilizando el elemento receiver.

+1

¿Este receptor registrado si está registrado en manifiesto que reside dentro de una actividad que está actualmente en pausa, podrá acceder a las variables privadas de su actividad adjunta? – Peterdk

+0

No importa, ahora veo que una clase Receiver no es una interfaz, sino una clase de la que debes heredar. – Peterdk

+0

@chris, no veo esto documentado en los documentos de Android. –

2

Tal vez se puede registrar el receptor en el servicio que se desarrollará a fondo

5

Añadir un Receiver a su proyecto y obtendrá este evento sin siquiera iniciar su aplicación.

public class TestReciver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     Log.d("TestReciver",intent.getAction()+"\n" 
       +intent.getDataString()+"\n" 
       +"UID: "+intent.getIntExtra(Intent.EXTRA_UID,0)+"\n" 
       +"DATA_REMOVED: "+intent.getBooleanExtra(Intent.EXTRA_DATA_REMOVED, false)+"\n" 
       +"REPLACING: "+intent.getBooleanExtra(Intent.EXTRA_REPLACING, false) 
      ); 
    } 

} 

y en su manifiesto de agregarlo como esto (Dentro de su aplicación < > etiqueta):

<receiver android:name="TestReciver" > 
    <intent-filter > 
     <action android:name="android.intent.action.PACKAGE_REMOVED" /> 
     <data android:scheme="package" /> 
    </intent-filter> 
</receiver> 

Cuando se utiliza un receptor como esto no se llama a cualquier registro o anular el registro por lo que siempre habrá estar listo para obtener datos.

Una nota es que esto no funcionará si permite que los usuarios muevan su aplicación a la tarjeta SD. Si se envía un evento cuando la tarjeta SD está desmontada, el receptor no estará accesible y se perderá el evento.

Cuestiones relacionadas