2009-12-11 4 views
36

Je démarre un service dans une activité puis je veux que le service s'arrête d'elle-même après un certain temps. J'ai appelé stopSelf() dans le service mais il ne fonctionne pas. Comment faire pour que le service s'arrête lui-même? Merci!!!Comment arrêter le service par lui-même?

+7

Depuis la réponse est « appel stopSelf() », vous allez avoir besoin de fournir beaucoup plus de détails en ce qui concerne « il doens't travail". – CommonsWare

+0

besoin de plus de contenu que juste "ne fonctionne pas" ' – footy

+1

comme une réponse? N'hésitez pas à le marquer * accepté * :) –

Répondre

4

Si par "ne fonctionne pas" vous voulez dire que le processus ne se tue pas, alors c'est comme ça que fonctionne Android. Le System.exit(0) ou Process.killProcess(Process.myPid()) va tuer votre processus. Mais ce n'est pas la manière Android de faire les choses.

HTH

51

En disant « ne fonctionne pas », je suppose que vous voulez dire que le onDestroy() -method du service est pas appelé.

J'ai eu le même problème, parce que je bound certains ServiceConnection au service lui-même en utilisant le drapeau BIND_AUTO_CREATE. Cela entraîne le maintien du service jusqu'à ce que chaque connexion soit unbound.

Une fois que je change d'utiliser aucun drapeau (zéro), je n'ai eu aucun problème à tuer le service par lui-même (stopSelf()).

code Exemple:

final Context appContext = context.getApplicationContext(); 
final Intent intent = new Intent(appContext, MusicService.class); 
appContext.startService(intent); 
ServiceConnection connection = new ServiceConnection() { 
    // ... 
}; 
appContext.bindService(intent, connection, 0); 

Tuer le service (non processus):

this.stopSelf(); 

Espoir qui a aidé.

5

puisque vous na pas publier votre code, je ne peux pas savoir exactement ce que vous faites, mais vous devez déclarer ce que vous arrêtez:

this.stopSelf(); 

comme dans:

public class BatchUploadGpsData extends Service { 
    @Override 
    public void onCreate() { 
     Log.d("testingStopSelf", "here i am, rockin like a hurricane. onCreate service"); 
     this.stopSelf(); 
    } 
+3

Corrigez-moi si je me trompe, mais ne m'arrêterais pas() sans que le 'ceci' fonctionne aussi bien? –

+0

@AbrahamPhilip 'this' est explicite, mais je ne peux pas dire si c'est absolument nécessaire. s'il vous plaît tester si possible. tks. –

+1

Ce n'est pas nécessaire, mais ça ne fait pas de mal de l'ajouter pour plus de clarté –

14

En appelant stopSelf(), le service s'arrête.

Veuillez vous assurer qu'aucun thread ne fonctionne en arrière-plan, ce qui vous donne l'impression que le service ne s'est pas arrêté.

Ajoutez des instructions d'impression dans votre fil de discussion.

Espérons que cela aide.

0

Je viens de rencontrer le même problème. Dans mon cas, j'ai un gestionnaire de service singleton que j'utilise pour communiquer avec le service. Dans le gestionnaire du service est démarré comme ceci:

context.bindService(new Intent(context, MyService.class), serviceConnection, Context.BIND_AUTO_CREATE); 

En supprimant Context.BIND_AUTO_CREATE comme suggéré par Alik Elzin, je suis en mesure d'arrêter le service à l'aide this.stopSelf() et d'avoir OnDestroy() appelé en faisant cela. Ce problème est qu'après cela, je n'ai pas pu redémarrer le service à partir du gestionnaire en utilisant la commande ci-dessus.

Enfin, j'ai corrigé cela en utilisant un rappel du service qui dit au gestionnaire d'arrêter le service. De cette façon, le gestionnaire est toujours en charge quand il s'agit de démarrer/arrêter le service et tout semble bien fonctionner.Je ne sais pas s'il y a des contre-indications pour le faire de cette façon.

Le code est vraiment simple. Créer un rappel dans le service et le mettre dans le gestionnaire comme celui-ci dans votre classe de connexion:

private ServiceConnection mServiceConnection = new ServiceConnection() { 
    public void onServiceConnected(ComponentName className, IBinder service) { 
     myService = ((MyService.LocalBinder)service).getService(); 

     myService.setCallback(new MyService.MyServiceCallback() { 
      @Override 
      public void onStop() { 
       stopService(); 
      } 
     }); 
    } 

    public void onServiceDisconnected(ComponentName className) { 
     myService = null; 
    } 
}; 

et arrêter le service:

public void stopService() 
{ 
    if(mServiceConnection != null){ 
     try { 
      mContext.unbindService(mServiceConnection); 
     } catch (Exception e) {} 
    } 

    mContext.stopService(new Intent(mContext, BleDiscoveryService.class)); 
} 

Au service, il suffit d'appeler myCallback.onStop() lorsque vous besoin d'arrêter.

2
stopForeground(true); 
      stopSelf(); 
0

Un autre hack sale non mentionné ici est de lancer une exception comme NPE. Un jour, j'ai dû arrêter InputMethodService et ce hack était utile.

0

Pour que votre service s'arrêter .. créer une classe BroadcastReceiver .. Dans votre service appelez votre récepteur comme celui-ci ..

Dans le service

sendBroadcast(new Intent("MyReceiver")); 

dans la diffusion du récepteur

public class MyReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 

     context.stopService(new Intent(context,NotificationService.class)); 
    } 
} 

Manif f ile

<receiver 
     android:name="MyReceiver" 
     android:enabled="true" 
     android:exported="true"> 
     <intent-filter> 
      <action android:name="MyReceiver"/> 
     </intent-filter> 
    </receiver> 
0

si vous utilisez Thread séparé dans votre service, après avoir arrêté le service en appelant stopSelf() ou stopService() le Thread continue à fonctionner. si tu veux arrêter Thread u devrait appeler Thread.interrupted() dans le Thread (il pourrait provoquer une Exception)

Questions connexes