with implement how example create android broadcastreceiver intentservice

example - how to implement a service in android



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

De la documentación de Android :

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

Luego, seguiría estos pares (usando la analogía de @StinePike):

onResume - onPause onStart - onStop

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

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

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

Nota: Necesito el servicio para ejecutarse en segundo plano.

Actualizar:

  1. Obtengo una excepción liberando receptores null .

  2. La actividad ha filtrado los receptores de intenciones. ¿Le falta la llamada a unregisterReceiver();

Por favor, dime si hay algún error, 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 de donde tengas registrado el receptor. Los pares de métodos complementarios son

onCreate - onDestroy onResume - onPause onStart - onStop

Si registra el receptor en el primero, anule el registro en su método de finalización.


Es tan simple como eso, si desea escuchar eventos incluso cuando su actividad no está visible, entonces llame a desregistrarse en onStop () (Ej. De la Actividad A, abre la Actividad B pero si desea que A siga escuchando los eventos) .

Pero cuando solo desea escuchar los eventos cuando su actividad es visible, en la llamada en línea anular el registro () (Por ejemplo, de la actividad A, abrió la actividad B, pero ahora no quiere escuchar los eventos de la actividad A).

Espero que esto ayude a su problema.


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

Por lo tanto, tiene sentido activarlos, solo cuando su actividad está en un estado para responder o cuando se está activando / activa, que es cuando se llama a onResume ().

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