web-dev-qa-db-fra.com

Le service ne s'arrête pas lorsque la méthode stopService est appelée

J'ai actuellement un service qui fonctionne correctement lorsque je le démarre, mais lorsque j'essaie de l'arrêter à l'aide de la méthode stopService, sa méthode onDestroy n'est pas appelée.

Voici le code que j'utilise pour essayer d'arrêter le service

stop_Scan_Button = (Bouton) findViewById (R.id.stopScanButton);

stop_Scan_Button.setOnClickListener(new View.OnClickListener(){
    public void onClick(View v){
        Log.d("DEBUGSERVICE", "Stop Button pressed");
        Intent service = new Intent(CiceroEngine. CICERO_SERVICE);
        releaseBind();
        Log.d("Stop_Scan_Button", "Service: " + service.toString());
        stopService(service);
        Log.d("Stop_Scan_Button", "Service should stop! ");

        }   
});

Ai-je raison de penser que lorsque stopService est utilisé, il appelle la méthode onDestroy du Service? Lorsque j'appuie sur le bouton Stop Scan, la méthode onDestroy() de mon service n'est pas appelée.

Y a-t-il autre chose qui me manque que je devrais mettre pour arrêter le service?

EDIT: pour ajouter onServiceConnected() est appelé lorsque stopService est exécuté au lieu de onServiceDisconnected(), pourquoi cela se produirait-il?

EDIT: pour ajouter plus d'informations concernant la liaison

J'appelle bindService dans la méthode onCreate () et j'ai ensuite la méthode releaseBind () pour dissocier le service.

Voici le code de cette méthode:

 public void releaseBind(){
    unbindService(this);
  }

Je suppose donc que la dissociation n'est pas mon problème?

25
Donal Rafferty

Je vais deviner que le fait d'avoir un appel de méthode pour releaseBind() signifie que vous avez déjà appelé bindService() sur ce service et que releaseBind() appelle unbindService(). Si ma supposition est incorrecte, veuillez ignorer cette réponse.


Un service s'arrête une fois que tous les appels bindService() ont eu leurs appels unbindService() correspondants. S'il n'y a pas de clients liés, le service aura également besoin de stopService() si et seulement si quelqu'un a appelé startService() sur le service.

Donc, il y a quelques possibilités ici:

  1. Vous avez toujours des clients liés (par exemple, d'autres activités), auquel cas vous ne pouvez pas arrêter le service jusqu'à ce qu'ils se délient
  2. Étant donné que unbindService() et stopService() sont asynchrones, quelque chose pourrait aller mal avec le timing, auquel cas vous pourriez avoir plus de chance si vous appelez stopService() depuis votre ServiceConnection's onServiceDisconnected() méthode

Gardez également à l'esprit que le moment exact de la destruction du service peut aller jusqu'à Android et peut ne pas être immédiat. Ainsi, par exemple, si vous comptez sur onDestroy() pour que votre service arrête certains travaux en cours, envisagez d'utiliser un autre déclencheur pour cela (par exemple, activité appelant une méthode stopDoingStuff() via l'interface du classeur de service).

43
CommonsWare

Toutes vos liaisons sont-elles fermées?

n service peut être utilisé de deux manières. Les deux modes ne sont pas entièrement séparés. Vous pouvez vous lier à un service qui a été démarré avec startService (). Par exemple, un service de musique de fond peut être démarré en appelant startService () avec un objet Intent qui identifie la musique à jouer. Ce n'est que plus tard, peut-être lorsque l'utilisateur souhaite exercer un certain contrôle sur le lecteur ou obtenir des informations sur la chanson en cours, qu'une activité établit une connexion au service en appelant bindService (). Dans des cas comme celui-ci, stopService () n'arrêtera pas réellement le service jusqu'à ce que la dernière liaison soit fermée

.

10
JRL

hai les gars désolé pour la réponse tardive mais pour autant que je sache, j'ai réussi à arrêter le service dans ce code: vous pouvez vérifier un lien ici.

public void onClick(View src) {
switch (src.getId()) {
case R.id.buttonStart:
  Log.d(TAG, "onClick: starting srvice");
  startService(new Intent(this, MyService.class));
  break;
case R.id.buttonStop:
  Log.d(TAG, "onClick: stopping srvice");
  stopService(new Intent(this, MyService.class));
  break;
}
}

et en classe de services:

    public class MyService extends Service {
       private static final String TAG = "MyService";


@Override
public IBinder onBind(Intent intent) {
    return null;
}

@Override
public void onCreate() {
    Toast.makeText(this, "My Service Created", Toast.LENGTH_LONG).show();
    Log.d(TAG, "onCreate");


}

@Override
public void onDestroy() {
    Toast.makeText(this, "My Service Stopped", Toast.LENGTH_LONG).show();
    Log.d(TAG, "onDestroy");

}

@Override
public void onStart(Intent intent, int startid) {
    Toast.makeText(this, "My Service Started", Toast.LENGTH_LONG).show();
    Log.d(TAG, "onStart");

}
}
4
dondondon