2010-03-19 11 views
7

Estoy trabajando para establecer una comunicación bidireccional entre una actividad y un servicio que se ejecuta en un proceso diferente.¿Cómo establecer una comunicación bidireccional entre actividad y servicio en diferentes procesos?

Consultar el proceso desde la Actividad no es gran cosa. Pero quiero que el proceso notifique a la Actividad sobre eventos. La idea detrás de esto es esta: el servicio se ejecuta independientemente de la aplicación real. Consulta un servidor web periódicamente. Si se encuentra una nueva tarea en el servidor web, el proceso debe notificar a la actividad.

Encontré this thread en AndDev.org pero parece que no funciona para mí. He estado jugando con BroadcastReceiver. Implementé una interfaz que debería notificar a la Actividad pero el problema es que el oyente siempre es nulo, ya que la Transmisión del proceso se realiza a través del Intento, por lo tanto, la clase que amplía BroadcastReceiver se instanciará por última vez.

¿Cómo puedo establecer una comunicación bidireccional? Esto debe ser posible. Gracias por cualquier ayuda,

steff

+0

¿Puede detallar cómo "consultar el proceso de la actividad no es gran cosa"> ¿Exactamente cómo lo hace? ¿Estás obligado al servicio? – Radu

Respuesta

4

O usa BroadcastReceiver o tiene el Activity register a callback or listener object que el Service llama a eventos clave. Los enlaces anteriores son para reservar proyectos de ejemplo que demuestren cada una de esas técnicas.

+0

¿Puedo usar un BroadcastReceiver dentro de mi Actividad o tengo que crear una clase diferente? ¿Debo especificar la clase que extiende BroadcastReceiver para la intención? – stfn

+0

'BroadcastReceiver' es una clase; una clase no puede ser una' Activity' ni 'BroadcastReceiver'. Puede usar una clase interna de su 'Activity' para' BroadcastReceiver', como se demuestra en el código de muestra vinculado anteriormente. Puede usar los nombres de los componentes para su transmisión 'Intents', pero esto requiere una clase pública' BroadcastReceiver'. O puede usar cadenas de acciones personalizadas, como se muestra en el código de ejemplo vinculado anteriormente. – CommonsWare

+0

Gracias, pero no estoy seguro de si un BroadcastReceiver es adecuado, ya que lo que quiero es un proceso de ejecución lo más largo posible, que sea independiente de la aplicación real. Debería poder mostrar una notificación en la barra de estado como lo hace un nuevo correo electrónico, incluso si la aplicación real no se está ejecutando. Entonces, esto significa que tengo que comenzar un servicio a través de startService (intención) en lugar de bindService (intención, conexión, indicadores), ¿verdad? He estado tratando de entender el RemoteServiceClient de ApiDemos, pero ha fallado patéticamente.Cuanto más miro 'ejemplos', más confundido me pongo ... – stfn

2

creo que debería tener el BroadcastReceiver iniciar su actividad de nuevo con el resultado de la Intención.

O podría usar AIDL sobre AIDL. Las muestras también tienen un (¿múltiple?) Ejemplo de cómo usar AIDL y servicios. Pero AIDL puede ser una gran molestia para su propósito.

+0

... ¿Comenzar mi actividad OTRA VEZ? Esto es lo que trato de evitar ... AIDL es realmente una molestia, pero parece ser el camino a seguir. Ahora estoy tratando de entender RemoteServiceBinding desde ApiDemos. Una dificil. – stfn

2

Tienes que usar BroadcastReceiver para recibir intenciones, y cuando quieras comunicarte simplemente crea una intención con los valores apropiados.

De esta forma, usted debería poder establecer una comunicación bidireccional entre cualquier componente.

+0

¿Podría detallar esta respuesta? Entonces, ¿implementa un BroadcastReceiver en el servicio y otro en la actividad? ¿Y envió Intents de ambos lados? Además, ¿puedo usar LocalBroadcastReceiver en lugar de BroadcastReceiver? – Radu

Cuestiones relacionadas