web-dev-qa-db-fra.com

stopSelf () vs stopSelf (int) vs stopService (Intent)

Quelle est la différence en appelant
stopSelf(), stopSelf(int) ou stopService(new Intent(this,MyServiceClass.class))
dans onStartCommand()?

par exemple si je démarre les mêmes services deux fois de cette façon:

...
Intent myIntent1 = new Intent(AndroidAlarmService.this, MyAlarmService.class);
myIntent1.putExtra("test", 1); 
Intent myIntent2 = new Intent(AndroidAlarmService.this, MyAlarmService.class);
myIntent2.putExtra("test", 2);
startService(myIntent1);
startService(myIntent2);
...

Et implémentez onStartCommand de cette manière:

public int onStartCommand(Intent intent, int flags, int startId)
{
Toast.makeText(this, "onStartCommand called "+intent.getIntExtra("test", 0), Toast.LENGTH_LONG).show();
stopService(new Intent(this,MyAlarmService.class));
return START_NOT_STICKY;
}

J'obtiens exactement le même comportement avec les trois méthodes, c'est-à-dire que onDestroy ne sera appelé qu'après l'exécution de onStartCommand deux fois.

41
GionJh

J'espère que cela t'aidera:

Un service démarré doit gérer son propre cycle de vie. Autrement dit, le système n'arrête ni ne détruit le service, sauf s'il doit récupérer la mémoire système et que le service continue de s'exécuter après le retour de onStartCommand (). Ainsi, le service doit s'arrêter en appelant stopSelf () ou un autre composant peut l'arrêter en appelant stopService ().

Une fois demandé d'arrêter avec stopSelf () ou stopService (), le système détruit le service dès que possible.

Cependant, si votre service gère simultanément plusieurs demandes à onStartCommand (), vous ne devez pas arrêter le service lorsque vous avez terminé de traiter une demande de démarrage, car vous pourriez avoir depuis reçu une nouvelle demande de démarrage (arrêt à la fin de la première demande mettrait fin à la seconde). Pour éviter ce problème, vous pouvez utiliser stopSelf (int) pour vous assurer que votre demande d'arrêt du service est toujours basée sur la demande de démarrage la plus récente.

Autrement dit, lorsque vous appelez stopSelf (int), vous transmettez l'ID de la demande de démarrage (le startId fourni à onStartCommand ()) auquel correspond votre demande d'arrêt. Ensuite, si le service a reçu une nouvelle demande de démarrage avant que vous ne puissiez appeler stopSelf (int), l'ID ne correspondra pas et le service ne s'arrêtera pas.

76
SourabhTech

Voici une description simplifiée:

  • stopSelf() est utilisé pour toujours arrêter le service actuel.

  • stopSelf(int startId) est également utilisé pour arrêter le service actuel, mais uniquement si startId était l'ID spécifié la dernière fois que le service a été démarré.

  • stopService(Intent service) est utilisé pour arrêter les services, mais de à l'extérieur le service à arrêter.

Ceci est la page de référence.

33
scottt

Les fonctionnalités de base des 3 méthodes sont identiques et c'est pourquoi elles portent des noms similaires. Il existe de très petites différences entre eux.

  • public final void stopSelf ()

Classe : elle appartient à la classe Android.app.Service

Appelé depuis : Cette méthode est destinée à être appelée depuis à l'intérieur du service seulement.

Comportement : Le service sera arrêté. onDestroy() état appelé.

  • public final void stopSelf (int startId)

Classe : elle appartient à la classe Android.app.Service

Appelé depuis : Cette méthode est destinée à être appelée depuis à l'intérieur du service seulement.

Comportement : Il existe une méthode de l'ancienne version stopSelfResult (int startId). Cette méthode est une version plus récente de cette méthode. Le service sera arrêté niquement si la dernière fois qu'il a été démarré était startId. onDestroy() état appelé.

Peut-être que vous pouvez trouver cette méthode utile uniquement dans le cas où vous avez démarré 2-3 instances du même service mais que vous souhaitez les arrêter dans un ordre que vous avez reçu avec la liste startId stockée avec vous. Besoin d'être très prudent lors de l'utilisation de cette méthode.

  • stopService booléen abstrait public (Service d'intention)

Classe : elle appartient à la classe Android.content.Context

Appelé depuis : Cette méthode est destinée à être appelée depuis en dehors du service bien que vous soyez autorisé à appeler de l'intérieur.

Comportement : Si le service n'est pas en cours d'exécution, rien ne se produit. 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é. onDestroy() état appelé.

4
MKJParekh

stopService () est appelé à partir de la classe à partir de laquelle le service est démarré. stopSelf () est appelé dans la classe de service en cours d'exécution pour arrêter le service

3
nawaab saab

stopSelf () = Arrêtez le service, s'il a été précédemment démarré.

stopSelf (int startId) = Ancienne version de stopSelfResult (int) qui ne renvoie pas de résultat.

stopSelfResult (int startId) = Arrêtez le service si la dernière fois qu'il a été démarré était startId.Its renvoie un résultat booléen.

1
Neha - Systematix

stopSelf (int) - qui est utilisé pour arrêter le service de démarrage le plus récent basé sur onStidCommand (Intent i, int f, int startid).

stopSelf () - qui est appelé par le service lui-même, une fois la tâche terminée.

stopService (Intent) - qui est explicitement appelé à partir d'une activité pour arrêter le service.

0

Il existe deux versions de stopSelf(). L'un prend un paramètre startId, pour indiquer que vous avez terminé le travail sur une commande spécifique, et donc le service doit s'arrêter de manière opportuniste s'il n'y a pas d'autres commandes en attente.

0
CommonsWare