Tengo la necesidad de crear un receptor de transmisión personalizado en el evento onCreate de una actividad y obviamente necesito cancelar el registro del receptor de transmisión en el evento onDestroy de la actividad.
Para mayor claridad, este es un fragmento del código que uso
public class AnActivity extends Activity {
private ResponseReceiver receiver;
public class ResponseReceiver extends BroadcastReceiver {
public static final String ACTION_RESP =
"mypackagename.intent.action.MESSAGE_PROCESSED";
@Override
public void onReceive(Context context, Intent intent) {
// TODO Start a dialogue if message indicates successfully posted to server
}
}
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
IntentFilter filter = new IntentFilter(ResponseReceiver.ACTION_RESP);
filter.addCategory(Intent.CATEGORY_DEFAULT);
receiver = new ResponseReceiver();
registerReceiver(receiver, filter);
}
@Override
public void onDestroy() {
super.onDestroy();
unregisterReceiver(receiver);
}
He leído que los eventos onPause / onResume y onStart / onStop para la actividad también deben registrar y anular el registro del receptor de transmisión.
Tengo muchas ganas de entender cuál se considera la mejor práctica para esto y por qué.
android
broadcastreceiver
jamesc
fuente
fuente
onDestroy()
se llama, el receptor no escuchará más eventos.Respuestas:
Debe registrar y anular el registro de sus destinatarios
onStart()
yonStop()
.La única razón por la que una Actividad registraría
BroadcastReceiver
s es para usar los eventos de alguna manera en la actividad actual, para informar al Usuario de un evento. SionStop()
ha sido llamado, entoncesActivity
ya no está en primer plano y, por lo tanto, no puede actualizar el Usuario.Si desea recibir eventos de transmisión en segundo plano, debe considerar usar un servicio como se indica aquí .
Como dice Konstantin,
onDestroy()
no se garantiza que se le llame, y podría continuar recibiendo transmisiones durante mucho tiempo, cuandoActivity
ya no esté abierto.fuente
Como
onDestroy()
no está garantizado para ser llamado, debe usaronPause()
para cancelar el registro. Considere el ciclo de vida de su receptor de transmisión: ¿Necesita que esté activo, solo cuando su actividad está en primer plano? Entonces usaonResume()
/onPause()
fuente
La documentación de Android no prescribe un solo lugar para registrar / anular el registro de receptores de transmisión, pero menciona tanto
onStart()
/onStop()
comoonResume()
/onPause()
como posibilidades.El factor más importante para tomar esta decisión es, ¿cuándo debe su receptor poder hacer su trabajo? Esto determinará cuándo registrarlo y anular el registro.
¿El receptor necesita hacer algo con la transmisión solo cuando la actividad está enfocada? Si es así, puede registrarlo / anular el registro en
onPause()
/onReceive()
. (También puede usar una vida útil más larga comoonStart()
/onStop()
, pero luego debe verificar durante el receptoronReceive()
si la actividad está enfocada).¿El receptor necesita hacer algo cuando está visible, incluso si no tiene el foco (por ejemplo, cuando se muestra un diálogo)? Si es así, use
onStart()
/onStop()
(o una vida útil más larga, pero nuevamente, el receptoronReceive()
debe verificar si la actividad es visible).¿El receptor necesita conocer la transmisión incluso cuando la actividad no es visible? Por ejemplo, ¿necesita recordar que ha sucedido algo, de modo que cuando la actividad se vuelva visible, pueda reflejar el estado de cosas resultante? Entonces necesita usar
onCreate()
/onDestroy()
para registrarse / anular el registro. (Tenga en cuenta que hay otras formas de implementar este tipo de funcionalidad).Si te registras
onStart()
, no los registres tambiénonResume()
, porque eso sería redundante:onResume()
nunca se llama sinonStart()
ser llamado primero.También tenga en cuenta que es mejor mantener onPause () lo más ligero posible :
Es cierto que
onDestroy()
se no garantiza que es llamado si el sistema mata a su proceso con el fin de ahorrar memoria. Sin embargo, si el proceso se mata, el proceso no recibirá transmisiones de todos modos. En ese caso, ¿es realmente necesario anular el registro de los receptores de transmisión?fuente
If you register in onStart(), don't also register them in onPause(), because that would be redundant: onPause() is never called without onStart() being called first.
es simplemente ilógica y confusa, especialmente cuando la respuesta aceptada es perfectamente precisa.Android puede matar su aplicación omitiendo el
onStop()
método. La mejor manera de resolver esa situación es registrarseBroadcastReceiver
en elonResume()
método y cancelar el registroonPause()
.fuente
onStop()
aswellDebe registrar y anular el registro de su transmisión en los métodos onResume () y onPause ().
si se registra en onStart () y lo cancela en onStop (). esa vez obtendrá el siguiente problema.
fuente