Vincular servicio a la actividad en Android

Estoy tratando de escribir un reproductor de medios simple que reproduce streaming de audio utilizando RTSP. Tengo una actividad GUI y un servicio que realiza la reproducción. Mi pregunta es cómo comunicarse mejor entre la actividad y el servicio (por ejemplo, actualizar el gui basado en el estado del reproductor).

Sé que puedo enlazar el servicio a la actividad usando onBind (), pero si entiendo correctamente esto detendrá el servicio si se cancela la actividad. Quiero continuar la reproducción incluso si el usuario sale de la actividad. ¿Existe alguna manera estándar o preferida de lidiar con este problema?

"Si inicia un servicio android con startService(..) el servicio permanecerá en ejecución hasta que invoque explícitamente stopService(..) Hay dos razones por las que el sistema puede ejecutar un servicio: Si alguien llama a Context.startService() Entonces el sistema recuperará el servicio (creándolo y llamando a su método onCreate() si es necesario) y luego llamará a su onStartCommand(Intent, int, int) con los argumentos suministrados por el cliente. Context.stopService() cuenta que varias llamadas a Context.startService() no anidan (aunque sí resultan en varias llamadas correspondientes a onStartCommand() ), por lo que no importa cuántas veces se inicie un El servicio se detendrá una vez que Context.stopService() o stopSelf() se llame, sin embargo, los servicios pueden utilizar su stopSelf(int) para garantizar que el servicio no se detenga hasta que se hayan procesado las intenciones iniciadas.

Los clientes también pueden utilizar Context.bindService() para obtener una conexión persistente a un servicio. Esto también crea el servicio si no está ya en ejecución (llamando a onCreate() mientras lo hace), pero no llama onStartCommand() . El cliente recibirá el objeto IBinder que devuelve el servicio de su onBind(Intent) , permitiendo al cliente hacer llamadas al servicio. El servicio permanecerá en funcionamiento siempre que se establezca la conexión (independientemente de si el cliente retiene una referencia en el IBinder del IBinder ). Por lo general, el IBinder devuelto es para una interfaz compleja que se ha escrito en AIDL.

Un servicio puede iniciarse y tener conexiones vinculadas a él. En tal caso, el sistema mantendrá el servicio funcionando siempre que se inicie o haya una o más conexiones con el indicador Context.BIND_AUTO_CREATE . Una vez que ninguna de estas situaciones se onDestroy() , se llama al método onDestroy() del servicio y el servicio se termina de forma efectiva. Toda limpieza (detención de subprocesos, eliminación de los receptores) debe estar completa al regresar de onDestroy() . "

En primer lugar, lo que necesitamos entender

Cliente

  • Hacer la solicitud a un servidor específico

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

Aquí mServiceConn es instancia de la clase de ServiceConnection (incorporada) es realmente la interfaz que necesitamos implementar con dos (1r para la red conectada y 2da red no conectada) método para supervisar el estado de la conexión de red.

Servidor

  • Se encarga de la solicitud del cliente y hacer réplica de su propio que es privado para el cliente sólo que envían solicitud y esta réplica de servidor se ejecuta en hilo diferente.

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

  • Servidor enviar respuesta con IBind Object.so IBind objeto es nuestro manejador que acceder 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 objeto y serviceMethode es un 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); 

Por consiguiente y yo podría crear un servicio pegajoso y enlazar con él. Tutorial detallado para el Ejemplo de servicio enlazado .

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

Esto puede plantear un problema cuando vuelva a conectarse a él, ya que probablemente no sepa si se está ejecutando o no cuando se inicia la actividad de nuevo, por lo que tendrá que considerar que en su código de actividad.

¡Buena suerte!

Esta es una respuesta sesgada, pero he escrito 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, se define una interfaz anotada con @Service y su clase de implementación, y la biblioteca crea y enlaza el servicio, maneja la conexión y el subproceso de trabajo de fondo:

 @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); <application android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme"> ... <service android:name="com.gmr.acacia.AcaciaService"/> ... </application> 

Puedes obtener una instancia del android.app.Service asociado para ocultar / mostrar notificaciones persistentes, usar tu propio android.app.Service y manejar manualmente el subproceso si lo deseas.

Si el usuario retrocede, se onDestroy() método onDestroy() . Este método consiste en detener cualquier servicio que se utiliza en la aplicación. Por lo tanto, si desea continuar el servicio incluso si el usuario se onDestroy() de la aplicación, simplemente borre onDestroy() . Espero que esto ayude.

  • ¿Qué significa la pérdida de una conexión de servicio?
  • Excepción de puntero nulo iniciando IntentService
  • Mejor momento / ubicación para configurar un AlarmManager
  • Detenga el servicio de Android cuando la aplicación se cierra con el administrador de tareas
  • Samsung inhabilita paquetes
  • Quiero publicar actualizaciones de ubicación cada 15 minutos al servidor incluso cuando la aplicación no se está ejecutando en primer plano
  • Detener servicio cuando la aplicación está cerrada
  • Android reproduciendo música en fondo
  • ¿Qué es "Stub" y "AIDL" para en java?
  • Actualizar MusicPlayer SeekBar en servicio
  • Servicios android - error: servicio no registrado
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.