Comment arrêter le service par lui-même?

Je commence un service dans une activité puis je veux que le service s’arrête après un certain temps.

J’ai appelé stopSelf () dans le service mais ça ne marche pas.

comment se faire arrêter le service? Merci!!!

En disant “ne fonctionne pas”, je suppose que vous voulez dire que la onDestroy() du service n’est pas invoquée.

J’ai eu le même problème, car j’ai lié certains ServiceConnection au Service lui-même en utilisant l’indicateur BIND_AUTO_CREATE . Cela provoque le maintien du service jusqu’à ce que chaque connexion ne soit pas liée .

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

Exemple de code:

 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 (pas le processus):

 this.stopSelf(); 

J’espère que ça a aidé.

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

Assurez-vous qu’aucun thread ne s’exécute 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 thread.

J’espère que cela t’aides.

comme vous n’avez pas publié votre code, je ne peux pas savoir exactement ce que vous faites, mais vous devez déclarer ce que vous arrêtez:

 this.stopSelf(); 

un péché:

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

Si par “ne fonctionne pas” vous voulez dire que le processus n’est pas tué, 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 façon de faire Android.

HTH

  stopForeground(true); stopSelf(); 

Je viens de rencontrer le même problème. Dans mon cas, j’ai un gestionnaire de services singleton que j’utilise pour communiquer avec le service. Dans le gestionnaire, le service est lancé 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, j’ai été capable d’arrêter le service en utilisant this.stopSelf () et d’avoir onDestroy () appelé. Ce problème est que par la suite je n’ai pas pu redémarrer le service depuis le gestionnaire en utilisant la commande ci-dessus.

Enfin, j’ai résolu ce problème en utilisant un rappel du service qui indique au gestionnaire d’arrêter le service. De cette façon, le responsable est toujours en charge pour démarrer / arrêter le service et tout semble fonctionner correctement. Je ne sais pas s’il y a des contre-indications pour le faire de cette façon.

Le code est vraiment simple. Créez un rappel dans le service et définissez-le dans le gestionnaire comme ceci 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êtez le service:

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

Dans le service, appelez simplement myCallback.onStop () lorsque vous devez l’arrêter.

Un autre piratage sale non mentionné ici est de lancer une exception comme NPE. Un jour, je devais arrêter InputMethodService et ce hack était utile.

Pour laisser votre service s’arrêter .. créez une classe BroadcastReceiver .. Dans votre service, appelez votre récepteur comme ceci ..

En service

 sendBroadcast(new Intent("MyReceiver")); 

Dans le récepteur de diffusion

  public class MyReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { context.stopService(new Intent(context,NotificationService.class)); } } 

Fichier manifeste

       

Si vous utilisez Thread séparé dans votre service, après avoir arrêté le service en appelant stopSelf() ou stopService() le Thread continue de s’exécuter. Si vous voulez arrêter Thread vous Thread.interrupted() appeler Thread.interrupted() dans le Thread (cela peut provoquer une Exception si le Thread est en veille)

Utilisez stopSelf () pour arrêter un service de lui-même.