2012-07-27 14 views
5

Estoy tratando de actualizar el estado de una IU al recibir una notificación de inserción. Para hacer esto, necesito comenzar un AsyncTask que realiza algunas operaciones de red y luego actualiza la UI en función del resultado.Uso de un BroadcastReceiver para iniciar una AsyncTask

De acuerdo con la documentación para BroadcastReceiver, realizando operaciones asíncronas dentro de un receptor es inseguro porque el proceso de ejecución que puede ser muerto tan pronto como onReceive() devoluciones, asumiendo que no hay otros "componentes de la aplicación" en ese proceso.

¿Funciona el BroadcastReceiver en su propio proceso o en el mismo proceso que la actividad que lo contiene? Como solo me preocupa la finalización de la tarea, siempre que haya una interfaz de usuario para actualizar, no estoy preocupado por la muerte del AsyncTask 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 el receptor?

Editar:

Para aclarar, estoy registrando el receptor en la actividad de onResume() y anular el registro que onPause(), por lo que sólo debería estar recibiendo intenciones cuando la actividad ya está activo.

+0

¿Por qué no utilizar un 'Servicio' en lugar de BroadcastReceiver si no es seguro? Lograría lo mismo, pero sin el problema del que hablas. – Andy

+0

@Andy Entiendo que usar un 'Servicio' será seguro en todas las circunstancias, pero estoy tratando de determinar si es realmente necesario en este caso particular. – jnackman

+1

Bueno, lo es si lo piensas bien. Los servicios son perfectos para ejecutar operaciones asincrónicas. De ahí que la misma limitación no esté presente. Los BroadcastReceivers se usan principalmente para otras cosas, como cuando sucede algo en el Sistema, no realmente cuando los datos se actualizan a través de la red. De ahí "Broadcast". Mientras que un 'Servicio' es lo que es, un servicio que está ejecutando en el lado que el usuario no necesita saber. Espero que tenga sentido. – Andy

Respuesta

5

El receptor de difusión no se está ejecutando en su propio proceso, se está ejecutando en el hilo de la interfaz de usuario.

Su proceso se cancelará después de que el método onReceive regrese solo si no se está ejecutando ninguna otra actividad o servicio en su aplicación.

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

+0

[enlace a la documentación oficial] (http://developer.android.com/reference/android/content/BroadcastReceiver.html#ProcessLifecycle) – renadeen

0

Lo que recomendaría hacer es startActivity(intent) desde el receptor de difusión. Eso es todo. Dentro de la intención, proporcionaría la información del evento de la que hablas, simplemente puedes establecer un parámetro en el paquete. Luego puede examinar esto dentro de la Actividad onStart() o onCreate(), cualquiera que se llame. Si la bandera está allí, desde el Activity se iniciará el AsyncTask.

No es necesario 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() también. Creo que no quieres hacer nada más que pasar y avanzar dentro de un receptor de transmisión.

BTW, las actividades no necesitan tener interfaz de usuario. Puede haber actividades sin rostro.

+0

Como mencionaste - _ ... las actividades no necesitan tener UI's_ - entonces yo lo recomiendo usando el servicio ... Pensé que las actividades se usan para la IU y los servicios para las tareas en segundo plano. –

1

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

1

Antes de Honeycomb (API11), tenía que usar un servicio.

Desde nido de abeja (API11), se puede utilizar goAsync():

Esto puede ser llamado por una aplicación en OnReceive (Contexto, Intención) a permita que se mantenga la difusió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 dentro de los 10s), pero permite la implementación para mover el trabajo relacionado con él a otro hilo para evitar fallar el hilo principal de la IU debido al disco IO.

Cuestiones relacionadas