2010-02-20 3 views
21

Je veux savoir quel est le meilleur endroit dans une activité pour lier un service? J'ai vu des exemples le faire dans onResume() et aussi dans onCreate(). Je me demandais si ce n'est pas un problème de le mettre dans onCreate(), parce que dans onPause() je ferai un unbind au service, donc je ne reçois pas un serviceConnectionLeak, si je laisse l'activité. Maintenant, si j'appuie sur le bouton principal, puis que je passe à l'écran d'accueil, l'activité se déconnecte du service, lorsque je retourne à l'activité du gestionnaire des tâches, onCreate() ne sera pas appelée et si le code tente d'accéder à un fonction du service, je vais obtenir une exception NullPointerException. Si je lie et déconnecte seulement dans onResume() et onPause() je n'ai pas ce problème. Ai-je raison?Liaison au service dans onCreate() ou dans onResume()

+0

Je regardais à nouveau sur des exemples qui sont liés dans onCreate() ils sont unbind dans onDestroy() et pas dans onPause(). Mais ce n'est toujours pas clair pour moi. – Harold

Répondre

44

Je recommande généralement le faire dans les deux onCreate()/onDestroy() ou onStart()/onStop(), selon la sémantique que vous voulez:

  • Si votre Activity veut être Communiquons avec le Service tout le temps, il est en cours d'exécution (par exemple, peut-être il peut récupérer des données d'un réseau pour vous et retournera les données lorsque vous êtes prêt et vous voulez permettre que cela se produise en arrière-plan, donc si l'utilisateur revient vous aurez les données prêtes), puis onCreate()/onDestroy() est probablement approprié. Notez que la sémantique ici est que tout le temps que votre Activity fonctionne, il a besoin du Service, donc si ce Service est en cours d'exécution dans un autre processus, vous en avez augmenté le poids et vous avez plus de chances de le tuer en arrière-plan .

  • Si votre Activity est seulement intéressé à travailler avec le Service tout visible, onStart()/onStop() est approprié. Cela signifie que votre Activity se détachera du Service lorsque l'utilisateur le quittera (et il ne sera plus visible) et se reconnectera la prochaine fois que le retour sera rétabli et repris.

je recommande ne serait généralement pas faire bind/délie dans onResume() et onPause(). Ceux-ci ne diminueront généralement pas significativement la quantité utilisée (Service (et donc votre overhead), et en fait, comme une pause et une reprise se produisent à chaque transition d'activité, c'est un chemin de code que vous voulez garder le plus léger possible. Le faire ici peut avoir d'autres conséquences négatives inattendues: par exemple si plusieurs Activity s dans votre application se lient au même Service, lorsqu'il y a une transition entre deux de ces activités, le Service peut également être détruit et recréé puisque le Activity actuel est mis en pause avant le prochain est repris.

ces paires (onCreate()/onDestroy(), onStart()/onStop(), onPause()/onResume()) sont destinés à être les paires appropriées pour acquérir et libérer des ressources (telles que la liaison à Service s, l'enregistrement des récepteurs, etc) pour veiller à ce qu'ils sont correctement acquis avant d'être nécessaires et libérés (et ne fuit pas) lorsqu'ils ne sont plus nécessaires.

+0

Ne mettra-t-on pas cela dans onResume()? 'if (listAdapter == null) {listAdapter = nouveau MyListAdapter (getApplicationContext());}' – likejiujitsu

+0

mais parfois @hackbod, ... j'ai également découvert la même erreur en libérant stopService() et aussi unbindService() par le biais onStop() méthode de chaque activité liée à ce service. et ... donc, pour enlever l'erreur, je mets juste un essai-et-attrape là et ... résolu! :RÉ – gumuruh

0

Ce que vous dites est correct. Dans la plupart des cas, vous voudrez vous inscrire au onResume() et vous désinscrire au onPause(). Si vous utilisez onCreate() et onDestroy(), vous serez toujours inscrit aux mises à jour lorsque vous êtes en pause, ce qui est un mauvais citoyen. Si vous vous enregistrez en onCreate() et que vous vous désinscrivez en onPause(), lorsque vous reprendrez la tâche, l'enregistrement aura disparu, ce qui n'est certainement pas ce que vous voulez.

+0

"Si vous utilisez OnCreate() et sur Destroy(), vous continuerez à vous enregistrer pour les mises à jour lorsque vous êtes en pause, ce qui est un mauvais citoyen." Avez-vous une source que vous pouvez citer pour cette déclaration? – CommonsWare

+0

C'était ma compréhension mais je m'en remets à vous. Est-ce pas correct? – RickNotFred

+2

Eh bien, pas comme une déclaration générale, que je suis au courant. Il y a la notion d '«inscription aux mises à jour» vis-à-vis des services comme exigence. Certains services que vous pouvez spécifiquement vouloir délier (et donc peut-être fermer) lorsque votre activité se passe hors de l'écran. D'autres vous pourriez ne pas. Par exemple, un service qui se connecte au GPS peut vouloir se fermer, mais uniquement si l'application est hors écran pendant une période prolongée, de sorte que l'utilisateur est moins frustré de devoir à nouveau acquérir le correctif GPS. Maintenant, il peut y avoir d'autres meilleurs conseils que les miens, c'est pourquoi je vous demandais si vous aviez une source. – CommonsWare

Questions connexes