Je travaille sur une application de lecteur de musique. J'ai une activité principale qui comporte plusieurs fragments, chacun affichant des chansons sur l'album de l'appareil, par artiste, etc.
J'ai un service de musique qui gère toutes les lectures et autres.
Ce qui me rend confus, c’est la liaison de ce service avec divers fragments que j’ai.
À l’heure actuelle, je lie l’activité principale et chaque fragment individuellement avec le service et son fonctionnement est excellent. Mais je me demandais si c'était vraiment la meilleure pratique? Existe-t-il un moyen de lier l’activité principale au service, puis de l’utiliser dans ses fragments enfants?
Il me manque peut-être un concept très élémentaire d'activité, de fragments ou de services. Si quelqu'un me guide s'il vous plaît à cet égard.
Je suppose que c’est plus une question conceptuelle que tout code n’est pas nécessaire. Mais si cela est nécessaire, merci de me le faire savoir.
MODIFIER :
Ma question est la suivante: quel serait le meilleur moyen de lier un service à une activité avec plusieurs fragments enfants (dont chacun utiliserait le service)?
Je pense que l’architecture cleanear consiste à lier directement le fragment. En ce qui concerne le problème décrit dans la réponse de Rarw, vous pouvez également vous connecter au service à partir de votre activité et de vos fragments. De cette façon, vous êtes sûr que le service sera disponible jusqu'à ce que l'activité ne soit pas détruite.
Je peux voir deux avantages principaux de la connexion à partir du fragment:
METTRE À JOUR
Voici un projet très simple montrant cela . https://github.com/ena1106/FragmentBoundServiceExample
La seule méthode que j’ai trouvée fiable consiste à utiliser un chargeur dans Fragment
:
Loader
dans le fragmentcontext
de la Loader
(définie sur activity
dans initLoader
à l'appel de onCreate
du fragment)onStartLoading
, en utilisant une ServiceConnection
qui appelle forceLoad()
dès que le service est liéonStartLoading
/onStopLoading
onStopLoading
vous pouvez utiliser le modèle de bus d'événements avec cette bibliothèque, modèle de publication/abonnement eventbus. https://github.com/greenrobot/EventBus consultez le site du projet pour plus d'informations.
vous pouvez envoyer des événements de/à un service à actif ou à des fragments
SI vous devez obtenir des données de votre service sur votre fragment au début de son cycle de vie, l'activité onServiceConnected on ne peut pas encore être appelée, principalement lorsque vous faites pivoter votre appareil, et vous obtiendrez un NPE. Je pense que c'est une bonne idée de laisser fragment établir ses propres connexions puisque le service est démarré avec startService () et non avec bindService ().
Vous pouvez accéder à votre activité à partir d'un fragment par getActivity()
Je lie le service dans l'activité Mon hôte et passe l'objet d'Ibinder par Bundle qui est défini dans les arguments.
et mon code peut aimer ça:
private ServiceConnection mConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
//put service in bundle
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};