Lier le service à l'activité ou au fragment?

Je travaille sur une application de lecteur de musique. J'ai une activité principale qui a plusieurs fragments, chacun affichant des chansons sur l'album de l'appareil sage, par son artiste, etc.
J'ai un service de musique qui gère toute la lecture et d'autres choses.
Ce dont je suis confus, c'est la liaison de ce service avec divers fragments que j'ai.
À l'heure actuelle, je lierais l'activité principale et chaque fragment individuellement avec le service et fonctionne très bien. Mais je me demandais si c'est vraiment la meilleure pratique. Existe-t-il un moyen de lier l'activité principale avec le service et ensuite, comment l'utiliser dans ses fragments d'enfant?
J'ai peut-être manqué un concept très basique d'activité ou de fragments ou de services. Donc, quelqu'un me guide à cet égard.
Je suppose que c'est plus une question conceptuelle, donc tout code n'est pas nécessaire. Mais encore si cela est requis, alors faites-le moi savoir.

MODIFIER :
Ma question est la suivante: quelle serait une meilleure façon de lier un service à une activité avec de multiples fragments d'enfant (dont chacun utiliserait le service)?

  • Supprimer les importations inutilisées dans Android Studio
  • Android: l'appel nécessite un niveau d'API 9 (la minute actuelle est 8): android.os.StrictMode # setThreadPolicy
  • Définissez une application spécifique pour ignorer l'optimisation par code dans Android M
  • De quoi ai-je besoin pour la programmation pour Tegra GPU
  • Comment un serveur prend en charge les demandes de services Web de plusieurs clients
  • Trouvez l'étiquette de volume de la carte SD sur Android
  • Android: 2 ou plus ExpandableListView à l'intérieur du tiroir de navigation
  • Image flou sur un autre appareil
  • Trouver les coordonnées exactes d'un seul personnage dans un TextView
  • Utilisation de SlidingPaneLayout d'Android avec ViewPager
  • Hôte USB Android et périphériques cachés
  • Fragment - removeGlobalOnLayoutListener IllegalStateException
  • 6 Solutions collect form web for “Lier le service à l'activité ou au fragment?”

    Reliez le Service à votre activité et non au Fragment . La description de votre application, une activité avec plusieurs Fragment qui sont échangés à l'intérieur et à l'extérieur, en fait l'approche la plus pratique (et vraiment uniquement).

    Lorsque vous liez un Service à une Activity vous attachez son cycle de vie à celui de l' Activity . Voir les services liés . Chaque fois que vous ajoutez ou supprimez un Fragment dans votre activité, ce Fragment est créé et détruit. Vous ne voulez pas essayer de lier un service à ce processus car il faudrait créer et détruire le service chaque fois qu'un nouveau fragment est créé ou détruit.

    Se lier plutôt à l' Activity hôte. Vous pouvez ensuite interagir avec votre activité hôte à partir de vos fragments avec une interface pour accéder au service lié ou par Intent .

    Je pense que l'architecture de nettoyage est de se lier directement à partir du fragment. En ce qui concerne le problème décrit dans la réponse de Rarw, vous pouvez vous lier au service de votre activité et de vos fragments aussi. De cette façon, vous êtes sûr que le service sera là jusqu'à ce que l'activité ne soit pas détruite.

    Je peux voir deux avantages principaux dans la connexion du fragment:

    1. La connexion au service est asynchrone, donc à l'intérieur du fragment, vous n'êtes jamais vraiment sûr que le service que vous recevez de l'activité n'est pas nul. Cela vous mènera au moins à des contrôles de pointeur null et à certains mécanismes pour rafraîchir le fragment à la fois lorsqu'il est créé et lorsque le service se connecte (vous êtes donc sûr d'afficher les données, quelle que soit la première des deux).
    2. Vous ne dépendez pas de l'activité particulière que vos fragments abandonnent. Pour obtenir le service de l'activité, je pense que vous faites une distribution dans la classe spécifique à l'activité. Vous pouvez créer une interface comme BoundActivity avec une méthode comme getBoundService pour obtenir le service, mais je pense que c'est un frais généraux compte tenu de l'avantage du point 1. Et si vous avez plusieurs services.

    METTRE À JOUR

    Voici un projet très simple montrant cela. https://github.com/ena1106/FragmentBoundServiceExample

    Vous pouvez accéder à votre activité à partir d'un fragment par getActivity()

    Vous pouvez faire un bac à l'aide du modèle de bus d'événement avec cette bibliothèque, le modèle de publication / abonnement d'événementbus. https://github.com/greenrobot/EventBus vérifie le site du projet pour plus d'informations.

    Vous pouvez envoyer des événements de / pour le service à des fragments actifs ou

    Si vous avez besoin d'obtenir des données de votre service sur votre fragment au début du cycle de vie des fragments, l'activité onServiceConnected on n'a pas pu être appelée, principalement lorsque vous faites pivoter votre appareil et que vous obtiendrez un NPE. Je pense que c'est une bonne idée, permettez à fragments de créer ses propres connexions, car le service démarre avec startService () et non avec bindService ().

    Je lier le service dans My Host Activity, et passer l'objet d'Ibinder par Bundle qui est défini dans les arguments.

    Et mon code pourrait l'aimer:

     private ServiceConnection mConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { //put service in bundle } @Override public void onServiceDisconnected(ComponentName name) { } }; 
    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.