Enlace el servicio a la actividad en Android

Intento escribir un reproductor multimedia simple que reproduzca audio en tiempo real usando RTSP. Tengo una actividad GUI y un servicio que realiza la reproducción. Mi pregunta es cómo comunicar mejor entre la actividad y el servicio (por ejemplo, actualizar la interfaz gráfica basada en el estado del jugador).

Sé que puedo vincular el servicio a la actividad usando onBind (), pero si lo entiendo correctamente, esto detendrá el servicio si se mata la actividad. Quiero continuar la reproducción incluso si el usuario sale de la actividad. ¿Hay alguna forma estándar o preferida para tratar este problema?

Primero que nada, 2 cosas que necesitamos entender

Cliente

  • hace solicitud al servidor específico

     bindService(new Intent("com.android.vending.billing.InAppBillingService.BIND"), mServiceConn, Context.BIND_AUTO_CREATE);` 

aquí mServiceConn es una instancia de la clase ServiceConnection (incorporada), en realidad es una interfaz que debemos implementar con dos (primero para la red conectada y segundo para la red no conectada) para monitorear el estado de la conexión de red.

Servidor

  • Maneja la solicitud del cliente y crea una réplica de la suya que es privada para el cliente que envía la solicitud y esta réplica del servidor se ejecuta en un hilo diferente.

Ahora en el lado del cliente, ¿cómo acceder a todos los métodos del servidor?

  • server send response con IBind Object.so IBind object es nuestro handler que accede a todo el método de servicio mediante el operador (.).

     MyService myService; public ServiceConnection myConnection = new ServiceConnection() { public void onServiceConnected(ComponentName className, IBinder binder) { Log.d("ServiceConnection","connected"); myService = binder; } //binder comes from server to communicate with method's of public void onServiceDisconnected(ComponentName className) { Log.d("ServiceConnection","disconnected"); myService = null; } } 

ahora cómo llamar al método que se encuentra en el servicio

 myservice.serviceMethod(); 

aquí myService es object y serviceMethode es el método en servicio. Y de esta manera la comunicación se establece entre el cliente y el servidor.

traté de llamar

 startService(oIntent); bindService(oIntent, mConnection, Context.BIND_AUTO_CREATE); 

en consecuencia, podría crear un servicio fijo y vincularlo. Tutorial detallado para el ejemplo de servicio enlazado .

Existe un método llamado unbindService que tomará una ServiceConnection que habrá creado al llamar a bindService. Esto le permitirá desconectarse del servicio mientras lo deja funcionando.

Esto puede suponer un problema cuando te conectas nuevamente, ya que probablemente no sabes si se está ejecutando o no cuando comienzas la actividad nuevamente, así que tendrás que considerarlo en tu código de actividad.

¡Buena suerte!

Esta es una respuesta parcial, pero escribí una biblioteca que puede simplificar el uso de los servicios de Android, si se ejecutan localmente en el mismo proceso que la aplicación: https://github.com/germnix/acacia

Básicamente, usted define una interfaz anotada con @Service y su clase implementadora, y la biblioteca crea y vincula el servicio, maneja la conexión y el hilo de trabajo en segundo plano:

 @Service(ServiceImpl.class) public interface MyService { void doProcessing(Foo aComplexParam); } public class ServiceImpl implements MyService { // your implementation } MyService service = Acacia.createService(context, MyService.class); service.doProcessing(foo);  ...  ...  

Puede obtener una instancia del android.app.Service asociado para ocultar / mostrar las notificaciones persistentes, usar su propio android.app.Service y manejarlo manualmente si lo desea.

Si el usuario retrocede, se onDestroy() método onDestroy() . Este método es para detener cualquier servicio que se use en la aplicación. Entonces, si desea continuar el servicio incluso si el usuario se onDestroy() de la aplicación, simplemente borre onDestroy() . Espero que esto ayude.