Android servicio notificar actividad completó la mejor manera?

He creado un servicio que sincroniza los datos de la web en un hilo de fondo y desea notificar una actividad de lista cuando el servicio se ha completado para que pueda actualizar su cursor? Cuál sería la mejor forma de hacer esto? Estoy pensando en enviar una transmisión cuando el servicio se hace, pero no estoy seguro de si esa es la mejor manera de hacerlo. ¿Necesito repetir el cursor cuando el servicio ha terminado así que no estoy seguro si eso trabajará bien con receptores de la difusión? No he hecho un montón de Android en un tiempo así que gracias de antemano.

2 Solutions collect form web for “Android servicio notificar actividad completó la mejor manera?”

Utilice un Handler en su servicio que registre un cliente cuando su ListActivity conecta al servicio; Es decir, en su método onServiceConnected en su ListActivity , envíe un Message a su servicio que le permite realizar un seguimiento de los clientes conectados. Entonces usted puede simplemente pasar por estos clientes en su Service y enviarles un Message cuando algo se lleva a cabo en su Service que desea notificar su ListActivity acerca de. Para obtener más información, puede consultar el código en un proyecto en curso de la mía: mi ListActivity y mi stub de Service .

En resumen, en su MainActivity , inicie y vincule a su servicio con:

 Intent i = new Intent(this, NetworkService.class); startService(i); bindService(i, networkServiceConnection, Context.BIND_AUTO_CREATE); 

Definir un mensajero para responder a los mensajes del servicio como:

 Messenger messenger = new Messenger(new IncomingHandler()); class IncomingHandler extends Handler { @Override public void handleMessage(Message msg) { switch (msg.what) { case NetworkService.MSG_SOMETHING: // do something here break; default: super.handleMessage(msg); } } } 

Y luego escribe tu código de conexión de servicio como:

 private ServiceConnection networkServiceConnection = new ServiceConnection() { public void onServiceConnected(ComponentName className, IBinder service) { networkService = new Messenger(service); try { Message msg = Message.obtain(null, NetworkService.MSG_REGISTER_CLIENT); msg.replyTo = messenger; networkService.send(msg); log.debug("Connected to service"); } catch (RemoteException e) { // Here, the service has crashed even before we were able to connect } } 

Tenga en cuenta que el replyTo es el mensajero que acabamos de crear.

En su NetworkService , mantenga un registro de los clientes conectados con:

 ArrayList<Messenger> clients = new ArrayList<Messenger>(); 

Y crea tu manejador como:

 class IncomingHandler extends Handler { @Override public void handleMessage(Message msg) { switch (msg.what) { case MSG_REGISTER_CLIENT: log.debug("Adding client: " + msg.replyTo); clients.add(msg.replyTo); break; default: super.handleMessage(msg); break; } } } 

A continuación, cuando desee enviar un mensaje a su MainActivity , simplemente haga algo como lo siguiente:

 for (int i = 0; i < clients.size(); i++) { try { clients.get(i).send(Message.obtain(null, MSG_SOMETHING)); } catch (RemoteException e) { // If we get here, the client is dead, and we should remove it from the list log.debug("Removing client: " + clients.get(i)); clients.remove(i); } } 

Si ya está utilizando la biblioteca de soporte, puede disparar una transmisión del servicio que utiliza LocalBroadcastManager de nuevo a su actividad para escuchar la emisión que se está enviando.

El uso de LocalBroadcastManager garantiza que su propia aplicación reciba la emisión para que no tenga que preocuparse por la pérdida de datos privados o la apertura de posibles fallos de seguridad.

También vea: cómo usar LocalBroadcastManager?

EDIT (09/2014):

Una manera mejor de hacer esto sería utilizar un marco del autobús del acontecimiento como Otto (mi favorito) o GreenRobot / EventBus para evitar acoplar sus componentes demasiado firmemente.

  • No se puede activar la aplicación desde el fondo en dispositivos Xiaomi hasta que "Autostart" se habilite manualmente
  • La escritura concurrente a la base de datos android (de múltiples servicios)?
  • Usuario apropiado del servicio de fondo / receptor de difusión
  • Cómo iniciar el servicio desde fragmentos
  • ¿Qué significa android: enabled para un servicio?
  • Enviar datos de la actividad al servicio
  • PeekService () devuelve null aunque el servicio se está ejecutando, si el servicio es reiniciado por el sistema después de matar OOM
  • ¿Cómo ejecutar el servicio no en el hilo principal?
  • Transmisión de audio mediante el servicio
  • ¿Cómo registrar un servicio de reconocimiento de voz personalizado?
  • ¿Está el servicio de Android todavía vivo incluso después de que onDestroy () sea llamado?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.