web-dev-qa-db-fra.com

Créer une seule instance de service (Android)

Comment puis-je m'assurer qu'une seule instance de service est créée?

J'ai vérifié certaines fonctions avec la journalisation (WeatherService est la classe qui étend le service):

Log.i(TAG, "Start  Id:" + WeatherService.this.hashCode());
Log.i(TAG, "End Id:" + WeatherService.this.hashCode());

Il donne différents codes de hachage même lorsque je suis sûr que la même fonction s'exécute deux fois (téléchargement):

09-12 01:00:55.195: INFO/WeatherService(7222): Start  Id:1137653208
09-12 01:00:57.235: INFO/WeatherService(7222): Start  Id:1137654296
09-12 01:00:59.035: INFO/WeatherService(7222): Start  Id:1138806536
09-12 01:01:39.085: INFO/WeatherService(7222): End Id:1137654296
09-12 01:01:39.265: INFO/WeatherService(7222): Start  Id:1137654296
09-12 01:02:22.175: INFO/WeatherService(7222): End Id:1137653208
09-12 01:02:24.815: INFO/WeatherService(7222): End Id:1138806536
09-12 01:02:24.836: INFO/WeatherService(7222): Start  Id:1138806536
09-12 01:02:40.275: INFO/WeatherService(7222): End Id:1137654296

Je lie une activité au service avec:

bindService(new Intent(getApplicationContext(),  WeatherService.class)
                               ,mServiceConnection, BIND_AUTO_CREATE);

Et le service peut fonctionner pendant quelques minutes jusqu'à ce qu'il soit terminé, par conséquent, le service peut être lié à/créé par de nombreuses activités

33
Torstein I. Bø

Comment puis-je m'assurer qu'une seule instance de service est créée?

Il ne peut y avoir qu'une seule instance d'un Service donné.

Il donne différents codes de hachage même lorsque je suis sûr que la même fonction s'exécute deux fois (téléchargement).

Alors this n'est pas le Service. Ou, le service avait été détruit et recréé entre les journaux.

Et le service peut fonctionner pendant quelques minutes jusqu'à ce qu'il soit terminé, par conséquent, le service peut être lié à/créé par de nombreuses activités

Ensuite, le Service est probablement détruit et recréé. Si vous avez besoin que le service fonctionne pendant quelques minutes, vous devez utiliser startService() et stopSelf() en plus de vos appels bindService() et unbindService(). Ou peut-être n'avez-vous pas besoin de lier du tout, auquel cas vous pourriez envisager d'utiliser un IntentService, car cela vous donne automatiquement un fil d'arrière-plan sur lequel effectuer vos téléchargements.

29
CommonsWare

J'ai vécu une situation similaire.
Si vous avez été écrit comme suit, une instance peut être créée sur une.

bindService(new Intent(getApplicationContext(),  WeatherService.class), mServiceConnection, BIND_AUTO_CREATE);

Essayez d'écrire une fois comme suit.

getApplicationContext().bindService(new Intent(getApplicationContext(), WeatherService.class),mServiceConnection, BIND_AUTO_CREATE);
8
Hogun