3 votes

Comment communiquer entre le service de lecture de musique et le thread de l'interface utilisateur

J'ai une liste de titres de musique dans un ListView.

Je peux cliquer sur chaque élément pour lire la musique à travers un lecteur multimédia dans un service.

Maintenant, je veux implémenter 2 fonctionnalités :

  • Barre de progression de la musique qui montre la position actuelle dans la chanson
  • Le service doit continuer à jouer lorsque la chanson est terminée avec la chanson suivante dans la liste

Alors comment puis-je mettre à jour l'interface utilisateur à partir d'un service en arrière-plan ? (Je sais qu'il y a des solutions sur Stackoverflow mais elles me semblent un peu exagérées pour envoyer une diffusion chaque seconde à partir du service) Dois-je utiliser le Binding ? Quels sont les avantages du Binding ? Pour l'instant, je démarre simplement le service avec un Intent (startService(intent)) qui contient le chemin de la chanson.

Qu'en est-il de la 2ème question ? Comment puis-je faire cela ?

2voto

Snicolas Points 19644

Je suppose que vous avez construit le service par vous-même. Ainsi, vous savez comment il est construit et comment accéder à une référence de mediaPlayer. Ce que vous devez faire est de transformer votre service en un service lié. Peut-être voulez-vous que votre service soit démarré via startService (sinon le service lié ne survivra pas à votre activité), mais par la suite, vous devrez vous lier à celui-ci depuis l'intérieur de votre activité.

Une fois que vous êtes lié, vous obtiendrez un IBinder (que vous définirez) et pourrez exporter la référence du mediaPlayer vers l'activité liée via ce IBinder. Ensuite, tout est assez simple, branchez un auditeur sur le lecteur multimédia et mettez à jour votre interface utilisateur (dans le thread de l'interface utilisateur !).

De plus, vous devrez mettre en avant votre service.

0voto

jJ' Points 1514

J'ai résolu des problèmes très similaires, cependant, j'ai fait la partie de mélange/lecture moi-même. Le code pour la partie android player-service est sur -github-

Pour la communication entre l'application et le service (il devrait s'agir d'un service en premier plan avec une notification dans la barre d'état, sinon il peut être tué / mis en pause assez fréquemment) j'ai expérimenté différentes approches et j'ai fini par

  • Activité -> Service - en utilisant Messenger
  • Service -> Activité / n'importe quoi d'autre - en utilisant BroadcastReceiver

Le code sur github n'est pas trop long (moins de 500 lignes au total, y compris les imports) pour vous donner de l'inspiration...

À propos, il montre également une liaison de service qui ne tue pas le service à la sortie de l'activité.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X