¿Vincular el servicio a la actividad o fragmento?

Estoy trabajando en una aplicación de reproductor de música. Tengo una actividad principal que tiene múltiples fragmentos, cada uno mostrando canciones en el dispositivo de disco sabio, artista sabio etc.
Tengo un servicio de música que maneja toda la reproducción y otras cosas.
Lo que estoy confundido es la vinculación de este servicio con varios fragmentos que tengo.
Ahora mismo estoy vinculando la actividad principal y cada fragmento individualmente con el servicio y su funcionamiento bastante bien. Pero me preguntaba si esto es realmente la mejor práctica? ¿Hay alguna manera de limitar la actividad principal con el servicio y luego algunos cómo utilizarlo en sus fragmentos de niño?
Tal vez me falta algún concepto muy básico de actividad o fragmentos o servicios. Así que alguien por favor me guíe en este sentido.
Supongo que es más una cuestión conceptual, por lo que no se necesita ningún código. Pero todavía si es necesario entonces por favor hágamelo saber.

EDIT:
Mi pregunta es: ¿cuál sería una mejor manera de vincular un servicio con una actividad con múltiples fragmentos de niños (cada uno de los cuales estaría utilizando el servicio)?

Vincule el Service a su actividad y no al Fragment . La descripción de su aplicación, una actividad con múltiples Fragment que se intercambian dentro y fuera, hace que este sea el enfoque más práctico (y realmente único).

Cuando vinculas un Service a una Activity , estás enlazando su ciclo de vida con el de la Activity . Vea Servicios enlazados . Cada vez que agregas o quitas un Fragment en tu actividad, ese Fragment se crea y destruye. No desea tratar de vincular un servicio a este proceso porque entonces tendría que crear y destruir el servicio cada vez que se crea o destruye un nuevo fragmento.

En su lugar, vincule a la Activity host. A continuación, puede interactuar con su actividad de host desde sus fragmentos con una interfaz para acceder al servicio enlazado o por Intent .

Creo que la arquitectura cleanear es unir directamente desde el fragmento. Respecto al problema descrito en la respuesta de Rarw, puedes enlazar al servicio de tu actividad y de tus fragmentos también. De esta manera usted está seguro de que el servicio estará allí hasta que la actividad no se destruya.

Puedo ver dos ventajas principales en la conexión del fragmento:

  1. La conexión de servicio es asíncrona, por lo que dentro del fragmento nunca estás realmente seguro de que el servicio que recibes de la actividad no es nulo. Esto le llevará al menos a algunas comprobaciones de puntero nulo ya algún mecanismo para actualizar el fragmento cuando se crea y cuando el servicio se conecta (por lo que está seguro de que mostrará los datos sin importar cuál de los dos ocurre primero).
  2. Usted no depende de la actividad particular de sus fragmentos deja pulg Para obtener el servicio de la actividad creo que está haciendo un molde a la clase de actividad específica. Usted podría crear una interfaz como BoundActivity con un método como getBoundService para obtener el servicio de él, pero creo que es una sobrecarga teniendo en cuenta la ventaja de punto 1. Y si usted tiene múltiples servicios.

ACTUALIZAR

Aquí hay un proyecto muy simple que muestra esto. https://github.com/ena1106/FragmentBoundServiceExample

Puede obtener acceso a su actividad desde un fragmento mediante getActivity()

Puede utilizar el patrón de bus de eventos con esta biblioteca, eventbus publicar / suscribir patrón. https://github.com/greenrobot/EventBus revise el sitio del proyecto para obtener más información.

Puede enviar eventos de / al servicio activo o fragmentos

Si necesita obtener algunos datos de su servicio a su fragmento al principio del ciclo de vida de los fragmentos, la actividad onServiceConnected aún no se puede llamar, principalmente cuando gira el dispositivo y obtendrá un NPE. Creo que es una buena idea dejar que el fragmento haga sus propias conexiones ya que el servicio se inicia con startService () y no con bindService ().

Enlazar servicio en My Host Activity, y pasar el objeto de Ibinder por Bundle que está establecido en argumentos.

Y mi código puede gustar esto:

 private ServiceConnection mConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { //put service in bundle } @Override public void onServiceDisconnected(ComponentName name) { } }; 
  • Obtener el color de píxel en segundo plano en Android
  • Android: ¿Cuándo usar Service vs Singleton?
  • ¿Cómo implementar funcionalidades como Facebook "New Story" característica?
  • OnBind () en servicio siempre devuelve Falso - Android
  • ¿Cómo inicio un servicio en un nuevo hilo?
  • Androide broadcastreceiver vs oyentes
  • ¿Cómo puedo llamar a startIntentSenderForResult en el servicio correctamente?
  • StopService () detendrá un servicio de primer plano?
  • Servicio de Android con la ubicación de los servicios de Google Play que hace que la aplicación se abra al azar
  • ¿Puede iniciar un IntentService en un proceso separado?
  • Obtener Excepción al mostrar el cuadro de diálogo de alerta de servicio - No se puede agregar ventana - el símbolo nulo no es para una aplicación
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.