¿Cuándo anular el registro de BroadcastReceiver? En onPause (), onDestroy (), o onStop ()?

¿Cuándo debo usar unregisterReceiver? En onPause() , onDestroy() , o onStop() ?

Nota: Necesito que el servicio funcione en segundo plano.

Actualizar:

  1. Tengo una excepción liberando receptores null .

  2. La actividad ha filtrado los receptores de la intención es que falta la llamada a unregisterReceiver();

Por favor, dígame si hay algo mal, aquí está mi código:

 private boolean processedObstacleReceiverStarted; private boolean mainNotificationReceiverStarted; protected void onResume() { super.onResume(); try { registerReceivers(); } catch (Exception e) { Log.e(MatabbatManager.TAG, "MAINActivity: could not register receiver for Matanbbat Action " + e.getMessage()); } } private void registerReceivers() { if (!mainNotificationReceiverStarted) { mainNotificationReceiver = new MainNotificationReceiver(); IntentFilter notificationIntent = new IntentFilter(); notificationIntent .addAction(MatabbatManager.MATABAT_LOCATION_ACTION); notificationIntent .addAction(MatabbatManager.MATABAT_New_DATA_RECEIVED); notificationIntent .addAction(MatabbatManager.STATUS_NOTIFCATION_ACTION); registerReceiver(mainNotificationReceiver, notificationIntent); mainNotificationReceiverStarted = true; } if (!processedObstacleReceiverStarted) { processedObstacleReceiver = new ProcessedObstacleReceiver(); registerReceiver(processedObstacleReceiver, new IntentFilter( MatabbatManager.MATABAT_ALARM_LOCATION_ACTION)); processedObstacleReceiverStarted = true; } } private void unRegisterReceivers() { if (mainNotificationReceiverStarted) { unregisterReceiver(mainNotificationReceiver); mainNotificationReceiverStarted = false; } if (processedObstacleReceiverStarted) { unregisterReceiver(processedObstacleReceiver); processedObstacleReceiverStarted = false; } } @Override protected void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); try { unRegisterReceivers(); mWakeLock.release();//keep screen on } catch (Exception e) { Log.e(MatabbatManager.TAG, getClass() + " Releasing receivers-" + e.getMessage()); } } 

Depende del lugar donde haya registrado el receptor. Los pares de métodos complementarios son

 onCreate - onDestroy onResume - onPause onStart - onStop 

Si registra el receptor en el primero y luego anular su registro en su método de finalización.

En la documentación de Android :

Debe implementar onStop () para liberar recursos de la actividad, como una conexión de red, o para anular el registro de receptores de difusión.

Entonces, yo seguiría estos pares (usando la analogía de StinePike):

 onCreate - onStop onResume - onPause onStart - onStop 

Debido al ciclo de vida de Android , y como @ w3bshark mencionado:

En los dispositivos post-HoneyComb (3.0+), onStop () es el último controlador garantizado.

Un receptor de difusión es un componente invisible. Todo lo que hace es responder a algún tipo de cambio a través de onReceive () de devolución de llamada.

Por lo que tiene sentido para activarlos, sólo cuando su actividad está en un estado para responder o cuando se está convirtiendo Enabled / active – que es cuando onResume () se llama.

Por lo tanto, es una mejor práctica registrarse en onResume () – Cuando la actividad es visible & Enabled y anular el registro en onStop () cuando la actividad ya no está activa.

Es tan simple como eso, si quieres escuchar eventos incluso cuando tu actividad no está visible, entonces llama a unregister en onStop () (Ej. De Actividad A, abre Actividad B pero si quieres que A siga escuchando los eventos) .

Pero cuando sólo desea escuchar sólo los eventos cuando su actividad es visible, entonces en onPause llamada unregister () (Por ejemplo, desde la Actividad A se abrió la Actividad B pero ahora no desea escuchar los eventos de la actividad A).

Espero que esto ayude a su problema.

  • Enviar una transmisión sólo a actividades específicas
  • ¿Necesita ayuda para descargar imágenes de fondo en Android?
  • Evitar que el "proceso de Android" sea un error "incorrecto"
  • Iniciar IntentService varias veces android
  • Android SignalR debe implementarse como Service o IntentService?
  • Cómo crear tostadas de IntentService? Se queda atascado en la pantalla
  • ¿Cómo notificar la actividad sobre los cambios en la variable global en la aplicación?
  • START_STICKY para IntentService
  • Android IntentService no está iniciando
  • Cómo detener un IntentService mientras hay muchos IntentService en ejecución
  • Servicios Roboeléctricos y de Intención
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.