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?
Répondre
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
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é.
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();
}
Corrigez-moi si je me trompe, mais ne m'arrêterais pas() sans que le 'ceci' fonctionne aussi bien? –
@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. –
Ce n'est pas nécessaire, mais ça ne fait pas de mal de l'ajouter pour plus de clarté –
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.
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.
stopForeground(true);
stopSelf();
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.
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>
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
)
- 1. Comment arrêter un service Windows par programme?
- 2. Comment arrêter le défilement horizontal par programme?
- 3. Arrêter le service SQL dans C#
- 4. Comment arrêter plusieurs instances d'un service Android?
- 5. Démarrer et arrêter un service
- 6. Comment arrêter un service Web WCF?
- 7. Comment puis-je arrêter les exceptions dans un service Web lancé par le client/l'appelant?
- 8. arrêter par programmation un service Windows en utilisant ruby
- 9. Mettre à jour une DLL sans arrêter le service
- 10. comment arrêter jQuery par défaut boucle accumulative
- 11. Comment arrêter un processus par programme
- 12. Arrêter/Exécuter le service Windows et créer une solution
- 13. Android: problème étrange pour arrêter un service
- 14. Comment arrêter le postback indésirable
- 15. Comment arrêter un service dans la méthode OnStart?
- 16. Arrêter le constructeur statique
- 17. Comment exécuter un exe à partir du service Windows et arrêter le service lorsque le processus exe se ferme?
- 18. Comment arrêter le son dans MATLAB?
- 19. Comment démarrer/arrêter le service SQL Server local directement à partir de Visual Studio?
- 20. Comment quitter/arrêter/terminer/arrêter/arrêter un processus MSBuild?
- 21. Comment arrêter le vol d'images d'auteur?
- 22. Comment arrêter le remplissage d'un validateur DateTime?
- 23. Comment arrêter une application si l'une des activités a été supprimée par le système d'exploitation
- 24. Flex. Arrêter le film
- 25. android comment arrêter gps
- 26. Comment arrêter le débogage (ou le processus de détachement) sans arrêter le processus?
- 27. Comment démarrer/arrêter le service Tomcat à distance en utilisant Ant
- 28. Comment arrêter le service "hg serve -d" de Mercurial sous Windows?
- 29. Comment faire pour arrêter l'application et exécuter le débogueur?
- 30. appeler le service web java par service web .net
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
besoin de plus de contenu que juste "ne fonctionne pas" ' – footy
comme une réponse? N'hésitez pas à le marquer * accepté * :) –