¿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.
- ¿Cómo descargar el archivo con el servicio en android?
- El método onHandleIntent () no se llama
- Android: Uso de WebView fuera de un contexto de actividad
- ¿Cómo se declara un servicio de intención en el manifiesto de Android?
- ¿Cómo hacer que WakefulService (IntentService) espere hasta que MediaPlayer termine?
Actualizar:
-
Tengo una excepción liberando receptores
null
. -
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()); } }
- Deteniendo un IntentService de una actividad
- Cómo verificar IntentService start
- IntentService no se está llamando
- ¿Qué sucede cuando mi actividad se destruye cuando estoy usando IntentService con ResultReceiver
- ¿Debo usar AsyncTask o IntentService para mi aplicación?
- ¿Necesita ayuda para descargar imágenes de fondo en Android?
- WakefulIntentService aclaraciones de implementación
- ¿Por qué no funciona LocalBroadcastManager en lugar de Context.registerReceiver?
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.
- Fragmentos de ViewPager – Transiciones de elementos compartidos
- Android Studio falla en la construcción de un nuevo proyecto, se agotó el tiempo de espera para el proceso aapt de esclavo