2010-08-26 16 views
14

No entiendo por qué recibo esta excepción al presionar el botón Atrás. Tengo el IntentReceiver registrado en el método onCreate y se supone que no está registrado en el método onPause. Mi llamada a Log.w() dentro del método onPause me lleva a creer que se está llamando al método unregisterReceiver(), pero todavía recibo esta excepción.Android: la excepción filtrada de IntentReceiver se está lanzando aunque llamo unregisterReceiver

¿Alguna idea?

private PlayerReceiver playerReceiver; 

public void onCreate(Bundle savedInstanceState) { 
... 
    IntentFilter playerFilter;  
    playerReceiver = new PlayerReceiver(); 
    playerFilter = new IntentFilter(PlayerService.BUFFERING_FAILURE); 
    playerFilter.addAction(PlayerService.BUFFERING_SUCCESS); 
    registerReceiver(playerReceiver, playerFilter); 
... 
} 

protected void onPause() { 
... 
    if (playerReceiver != null){ 
     unregisterReceiver(playerReceiver); 
     Log.w(TAG, "playerReceiver has been unregistered"); 
     playerReceiver = null; 
    } 
... 
} 

public class PlayerReceiver extends BroadcastReceiver { 

    public void onReceive(Context context, Intent intent) { 
     if (intent.getAction().equals(PlayerService.BUFFERING_FAILURE)){ 
      setListenButton(false); 
     } 
     closePlayDialog(); 
    } 
} 

LogCat salida

08-26 11:44:28.646: WARN/WWOZMain(1058): playerReceiver has been unregistered  
08-26 11:44:29.476: ERROR/ActivityThread(1058): Activity org.wwoz.WWOZMain has leaked IntentReceiver [email protected] that was originally registered here. Are you missing a call to unregisterReceiver()?  
08-26 11:44:29.476: ERROR/ActivityThread(1058): android.app.IntentReceiverLeaked: Activity org.wwoz.WWOZMain has leaked IntentReceiver [email protected] that was original 

Ly aquí registrados. ¿Te estás perdiendo una llamada para anular el registro de Receiver()?

+4

En general, debe registrarse en 'onResume' y anular el registro en' onPause' (o 'onStart' y' onStop'). Por lo tanto, es posible que se registre varias veces sin volver a registrarse cuando se reanude la actividad. ¿Qué parece lo opuesto al problema que estás teniendo, pero supongo que todavía podría desencadenar la misma advertencia de registro? –

+0

Argh! Gracias Christopher. Ni siquiera presté atención al hecho de que estaba registrando el receptor en 'onCreate' y' onResume'. Entonces, en cambio, me estaba registrando dos veces y solo anulé el registro una vez. Doh! –

Respuesta

20

Este es un problema del ciclo de vida de la actividad de Android. Lo estoy viendo en una actividad principal y luego probando en el dispositivo con el botón Atrás que vuelve a la pantalla de bienvenida.

En el método onPause().

Eliminar el registro de la BroadcastReceiver que creó en el onCreate()

En el onRestart() volver a registrar un nuevo receptor de difusión.

En la clase de actividad necesita mantener un registro de Broadcast Receiver como miembro de datos de instancia.

SEGUNDO

creo que esto también es un problema de mejora de funciones con Android.

A veces los desarrolladores necesitan un receptor de difusión para sobrevivir a la actividad. Por ejemplo, para comprender cuándo ciertos estados de pantalla están disponibles o no. Piense en un contexto de conversación del modelo de flujo de trabajo, que tiene muchos estados.

TERCER

puede registrar y anular el registro de los receptores de radiodifusión con una actividad, pero una llamada simple como isRegistered(BroadcastReceiver) en la clase de actividad puede ser muy útil.

Si necesita receptores para vivir más allá de la actividad, entonces no respondo, excepto para silenciar la advertencia, agregando unregister(X) en la llamada onDestroy(). YMMV ;-)

8

Tuve exactamente el mismo problema. La causa fue que inadvertidamente había registrado el mismo BroadcastReceiver dos veces.

3

Mi situación era similar con Mullins, registré un receptor tanto en una clase como en su subclase.

Para los novatos como yo, basta con alternar un punto de interrupción en su receiver, luego depurar la aplicación. Si el receptor es algo así como [email protected], mientras que el registro de errores en logcat es diferente de él, como [email protected], con caracteres después de "@" diferente, seguramente lo registró dos veces (o más).

(Por encima de me gusta un comentario en la respuesta de Mullins, en realidad, lo publico aquí porque no puedo publicar comentarios ahora.)

Cuestiones relacionadas