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.

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.

  • ¿Cuándo se destruye un servicio iniciado y enlazado?
  • No se puede iniciar el servicio Intención {flg = 0x4 cmp = com.UserLogin / .BgService (tiene extras)}: no encontrado
  • No se puede iniciar el servicio con null
  • Ejecutar un servicio con privilegios de root o agregar permisos con root
  • ¿Cómo podemos evitar que un servicio muera por un sistema operativo?
  • Administrador de alarmas programado no funciona Android
  • ¿Puede iniciar un IntentService en un proceso separado?
  • No se puede activar la aplicación desde el fondo en dispositivos Xiaomi hasta que "Autostart" se habilite manualmente
  • ¿Necesito un servicio en mi aplicación Android?
  • ¿Por qué otro servicio encima de IMarketBillingService?
  • Cómo el calendario de Google o Instagram hacer sus aplicaciones todo el tiempo en marcha y funcionando incluso después de la parada de fuerza
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.