2011-10-05 12 views
7

Necesito registrar un receptor. He estado usando el siguiente patrón:¿Patrón correcto para registrar un receptor?

@Override 
protected void onResume() { 
    super.onResume(); 
    registerReceiver(myReceiver, new IntentFilter(...)); 
} 

@Override 
protected void onPause() { 
    super.onPause(); 
    unregisterReceiver(myReceiver); 
} 

private BroadcastReceiver myReceiver = new BroadcastReceiver() { 
    ... 
}); 

Estoy recibiendo informes de fallos de mercado sobre mi unregisterReceiver() llamada:

java.lang.IllegalArgumentException: Receiver not registered 

pensé que esto no podría ser posible, pero parece que esto es el patrón correcto en su lugar:

private Intent mIntent; 

@Override 
protected void onResume() { 
    super.onResume(); 
    if (mIntent == null) { 
     mIntent = registerReceiver(myReceiver, new IntentFilter(...)); 
    } 
} 

@Override 
protected void onPause() { 
    super.onPause(); 
    if (mIntent != null) { 
     unregisterReceiver(myReceiver); 
     mIntent = null; 
    } 
} 

private BroadcastReceiver myReceiver = new BroadcastReceiver() { 
    ... 
}); 

¿Es el anterior el patrón correcto? Supongo que es posible que el registro falle, y tenemos que mantener el resultado de registerReceiver() y registrarlo en Pause() antes de realizar la llamada para anular el registro()?

Gracias


estoy basando el cambio fuera de esta pregunta: Problem with BroadcastReceiver (Receiver not registered error)

Yo sólo he visto el primer patrón anterior, no uno donde se comprueba la respuesta de la intención - cualquier aclaración sería genial.

Respuesta

5

¿Es el anterior el patrón correcto?

No, esto no necesariamente va a funcionar. A partir de los documentos de registerReceiver(...) ...

devoluciones El primer intento pegajosa que se encuentra que coincide con filtro, o null si no hay ninguno.

En otras palabras, incluso si la llamada para registrar el receptor es exitosa, aún puede devolver nulo si no hay transmisiones fijas para ese filtro de intención.

Mi enfoque sería utilizar simplemente un valor lógico y un bloque try/catch ...

private boolean isReceiverRegistered; 

@Override 
protected void onResume() { 
    super.onResume(); 
    if (!isReceiverRegistered) { 
     registerReceiver(myReceiver, new IntentFilter(...)); 
     isReceiverRegistered = true; 
    } 
} 

@Override 
protected void onPause() { 
    super.onPause(); 
    if (isReceiverRegistered) { 
     try { 
      unregisterReceiver(myReceiver); 
     } catch (IllegalArgumentException e) { 
      // Do nothing 
     } 
     isReceiverRegistered = false; 
    } 
} 
+0

Ok gracias por esto, tiene sentido. – user291701

Cuestiones relacionadas