2010-08-18 4 views

Répondre

80

Je pense que la réponse de hara était un peu confus. Ce que vous décrivez est parfaitement légitime et en fait le seul moyen d'obtenir le comportement que vous voulez. Si vous créez un service en lui liant, il mourra lorsque vous ne serez plus connecté. Donc, la seule façon de le garder sans activités est de le démarrer avec startService(). Il n'y a pas de conflit avec les cycles de vie, car cela ne s'applique qu'à la façon dont le service est démarré. Donc, une fois démarré avec startService(), il suit ce processus de cycle de vie. Vous pouvez donc vous lier et vous déconnecter autant que vous le souhaitez et il ne mourra que lorsque vous appellerez stopService() ou stopSelf()

+4

Comment puis-je lier à un service qui a été démarré avec startService()? – user123321

+3

@musselwhizzle: cette question est extrêmement ancienne. Si vous avez une question, commencez un nouveau sujet de discussion. Mais il n'y a aucune différence dans la méthode dans laquelle vous vous liez à un service déjà en cours d'exécution. – Falmarri

+1

Vous devez également noter que pour qu'un service soit complètement supprimé du cycle de vie d'une activité, démarrez le service en transmettant le contexte de l'application. Cela signifie que le service est lié au cycle de vie de l'application plutôt qu'à l'activité. Regardez également dans START_STICKY. Renvoyer le début collant avec le contexte de l'application permet à votre service de s'exécuter retiré du cycle de vie de l'application et de se redémarrer en cas d'échec avant d'avoir atteint son but. – superuserdo

8

Si vous démarrez un service en utilisant startService(), vous devez l'arrêter en utilisant stopService().

Il existe deux raisons pour lesquelles un service peut être exécuté par le système. Si quelqu'un appelle Context.startService() alors le système récupérera le service (en le créant et en appelant sa méthode onCreate() si nécessaire), puis appellera sa méthode onStartCommand (Intent, int, int) avec les arguments fournis par le client. Le service continuera à ce stade jusqu'à ce que Context.stopService() ou stopSelf() soit appelé. Notez que plusieurs appels à Context.startService() ne s'emboîtent pas (bien qu'ils aboutissent à plusieurs appels correspondants à onStartCommand()), donc peu importe le nombre de fois qu'il est démarré, un service sera arrêté une fois Context.stopService() ou stopSelf() est appelé; cependant, les services peuvent utiliser leur méthode stopSelf (int) pour s'assurer que le service n'est pas arrêté tant que les intentions commencées n'ont pas été traitées.

Vous pouvez lier au service autant de ServiceConnection que vous le souhaitez avec bindService(), mais faites attention à l'indicateur que vous lui avez transmis. Si vous passez 0 alors si vous appelez stopService() le service s'arrêtera (je ne sais pas exactement ce qui vous arrive ServiceConnection). Sinon, si vous souhaitez que votre service reste actif jusqu'à ce que ServiceConnection soit lié, utilisez BIND_AUTO_CREATE.

c'est de stopservice():

Demander que d'arrêter un service d'application donnée. Si le service ne fonctionne pas, rien ne se passe. Sinon, il est arrêté. Notez que les appels à startService() ne sont pas comptés - cela arrête le service quel que soit le nombre de fois qu'il a été démarré.

Notez que si un service arrêté a encore des objets ServiceConnection liés avec l'ensemble BIND_AUTO_CREATE, il ne sera pas détruit tant que toutes ces liaisons n'auront pas été supprimées. Voir la documentation du service pour plus de détails sur le cycle de vie d'un service.

Cette fonction lancera SecurityException si vous n'êtes pas autorisé à arrêter le service donné.

J'espère que cela aide ..

8

Oui, vous pouvez démarrer et lier (une ou plusieurs fois) le même service .

L'organigramme suivant montre comment le cycle de vie d'un service est géré.Le compteur variable suit le nombre de clients liés: enter image description here

Bon exemple - application musicale. Explication de Building a Media Browser Service tutoriel officiel:

Un service qui est lié (et non commencé) est détruit quand tout de ses clients UNBIND. Si votre activité d'interface utilisateur se déconnecte à ce stade, le service est détruit. Ce n'est pas un problème si vous n'avez pas encore joué de la musique. Cependant, lorsque la lecture commence, l'utilisateur s'attend probablement à continuer à écouter même après avoir changé d'application. Vous ne voulez pas détruire le lecteur lorsque vous déliez l'interface utilisateur pour travailler avec une autre application . Pour cette raison, vous devez vous assurer que le service est démarré lorsque commence à être lu en appelant startService(). Un service démarré doit être explicitement arrêté, qu'il soit lié ou non. Cela garantit que votre lecteur continue à fonctionner même si l'activité d'interface utilisateur de contrôle n'est pas reliée.

Pour arrêter un service démarré, appelez Context.stopService() ou stopSelf(). Le système arrête et détruit le service dès que possible. Toutefois, si un ou plusieurs clients sont toujours liés au service, l'appel pour arrêter le service est retardé jusqu'à ce que tous ses clients ne soient pas liés.

De Service ref:

Un service peut être à la fois commencé et ont connexions qui lui sont liés. Dans un tel cas , le système gardera le service en cours d'exécution tant qu'il est démarré ou qu'il y a une ou plusieurs connexions avec l'indicateur Context.BIND_AUTO_CREATE. Une fois que aucune de ces situations ne tient, la méthode onDestroy() du service est appelée et le service est effectivement terminé .

Questions connexes