Utilizar un BroadcastReceiver para iniciar un AsyncTask

Estoy tratando de actualizar el estado de una interfaz de usuario al recibir una notificación push. Para ello, necesito iniciar un AsyncTask que realiza algunas operaciones de red y luego actualiza la interfaz de usuario con base en el resultado.

De acuerdo con la documentación de BroadcastReceiver , realizar operaciones asíncronas dentro de un receptor no es seguro porque el proceso que lo ejecuta puede ser onReceive() tan pronto como onReceive() devuelve, asumiendo que no hay otros "componentes de aplicación" en ese proceso.

¿El BroadcastReceiver ejecuta en su propio proceso o en el mismo proceso que la Actividad que lo contiene? Ya que sólo me preocupa la finalización de la tarea, siempre y cuando hay una interfaz de usuario para actualizar, no estoy preocupado por el AsyncTask morir si la actividad está cerrada. Suponiendo que BroadcastReceiver esté en el mismo proceso que la actividad, ¿esto hace que sea correcto / seguro iniciar la tarea que he descrito desde dentro del receptor?

Editar:

Para aclarar, estoy registrando el receptor en onResume() la actividad onResume() y onPause() en onPause() , por lo que sólo debe recibir intenciones cuando la actividad ya está activa.

Broadcast receptor no se está ejecutando en su propio proceso, se ejecuta en el hilo de interfaz de usuario.

El proceso se eliminará después de que el método onReceive devuelve sólo si no hay ninguna otra actividad o servicio en la aplicación que se está ejecutando.

Si su receptor de difusión es una instancia de una clase interna y sólo recibe cuando su actividad está activa, entonces su proceso no se eliminará después de devolver el método onReceive.

Si dentro de su AsyncTask , necesita un contexto, entonces creo que un servicio es mejor. Si no, no hay ningún problema con AsyncTask .

Antes de Honeycomb (API11), había que utilizar un servicio.

Desde Honeycomb (API11), puede utilizar goAsync () :

Esto puede ser llamado por una aplicación en onReceive (Context, Intent) para permitir que mantenga la transmisión activa después de regresar de esa función. Esto no cambia la expectativa de ser relativamente sensible a la difusión (finalizándolo en 10s), pero sí permite que la implementación traslade el trabajo relacionado a ella a otro hilo para evitar el glitching del hilo principal de la interfaz de usuario debido al E / S de disco.

Lo que yo recomendaría hacer es startActivity(intent) del receptor de difusión. Eso es todo. Dentro de la intención que proporcionaría la información del evento de que habla, sólo puede establecer un parámetro en el paquete. A continuación, puede examinar esto dentro de la actividad onStart() o onCreate() cualquiera que se llama. Si la bandera está allí, entonces desde la Activity arranca la AsyncTask .

No hay necesidad de utilizar un servicio en absoluto, con todas las limitaciones vinculantes y de comunicación de la actividad de servicio.

Recuerde que también puede startActivityForResult() . Pienso que usted no quiere hacer nada excepto pasar y adelante dentro de un receptor de la difusión.

Por cierto, las actividades no necesitan tener IU. Puede haber actividades sin rostro.

  • Android: respuesta de la actividad del mercado
  • Cómo modificar la vista de la pantalla de llamadas entrantes y salientes en android
  • ¿Cómo detener / cancelar el administrador de alarmas en otra actividad?
  • Llamar un método de actividad de BroadcastReceiver en Android
  • evitando un bloqueo cuando alguien monta una tarjeta SD de Android
  • Android captura nueva llamada saliente
  • Intercepción de SMS de Android sin icono de notificación o mensajes WAP-PUSH
  • Widget onUpdate llamado cuando se inicia la Actividad de configuración
  • TaskStackBuilder # startActivities () NullPointerException
  • Receptor de difusión no funciona después de reiniciar el dispositivo en Android
  • Abrir la aplicación cuando se conecta con wifi
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.