web-dev-qa-db-fra.com

Comment est-il possible Service fonctionner indéfiniment et permettre également la liaison dans Android?

Je veux un service qui peut fonctionner en arrière-plan jusqu'à ce que je m'arrête, même si le composant qui l'a démarré est détruit et permet également la liaison aux activités. Comment c'est possible ? 

Selon le document de services liés Android - il existe trois façons de créer un service lié

  1. Classe de liant extensible.
  2. Utiliser Messenger. 
  3. Utiliser AIDL.

J'ai créé un service lié à l'aide de Messenger (2ème méthode). L'activité est liée au service dans sa méthode onStart () et non liée à sa méthode onStop (). La messagerie bidirectionnelle (entre activité et service) fonctionne correctement. Mais le problème est que lorsque l'activité dissocie le service, le service est détruit. Mais je veux un service qui peut fonctionner indéfiniment. 

C'est possible avec Android Guide de développement des services - "Bien que cette documentation traite généralement de ces deux types de services séparément, votre service peut fonctionner dans les deux sens: il peut être démarré (pour s'exécuter indéfiniment) et autoriser la liaison. Il s'agit simplement d'un Peu importe si vous implémentez plusieurs méthodes de rappel: onStartCommand () pour permettre aux composants de le démarrer et onBind () pour permettre la liaison. "

J'implémente également la méthode onStartCommand () dans service et renvoie START_STICKY, mais elle n'est jamais appelée. En regardant les rappels de cycle de vie du service limité dans le guide de développement, il n'y a pas de méthode de rappel onStartCommand (). Alors comment est-il possible d’exécuter le service jusqu’à ce que nous arrêtions et permettions également la liaison?

J'utilise la plate-forme Eclipse dans Fedora 15 OS.

De l'aide.....

36
Khushbu Shah

Vous devez juste le démarrer avec startService() quelque part. Cela l'empêchera d'être arrêté automatiquement lorsqu'il n'y aura plus de liaisons. 

De la Documentation de service , soulignons le mien:

Un service peut être à la fois démarré et lié à des connexions. Dans Dans ce cas, le système continuera à fonctionner aussi longtemps que il est démarré ou il y a une ou plusieurs connexions à cela avec l'indicateur Context.BIND_AUTO_CREATE.

Comme d'autres l'ont fait remarquer, Android pourrait encore tuer si des ressources étaient nécessaires. Vous pouvez "hiérarchiser" votre service et le rendre moins susceptible d'être tué si vous en faites un premier plan .

46
Joel F

Je n'ai pas utilisé de services avec le service de messagerie, mais je suis lié à un service distant avec une interface distante (AIDL). Mes découvertes peuvent être utiles. Comme mon activité principale et mon service sont actuellement implémentés, je me lie au service comme vous le faites avec du code comme

mServiceConnected = bindService(new Intent("com.mypackage.MyService.SERVICE"), this,
                Context.BIND_AUTO_CREATE);

Mon activité implémente ServiceConnection

Lorsque j'appelleunbindService (this)à la fin de l'activité, la méthode onDestroy () du service est alors appelée, comme vous l'avez découvert.

Si toutefois, avant la ligne bindService, je lance aussi explicitement le service avec 

startService(new Intent("com.mypackage.MyService.SERVICE"));

alors l'unBind ne provoque pas l'exécution du service onDestroy () du service. Il est toujours nécessaire d'appeler unbindService dans l'activité onDestroy/Stop de l'activité, sinon vous risquez de perdre une connexion de service.

Dans mon cas, le service reste vraisemblablement disponible pour que d'autres applications puissent s'y connecter via son interface distante.

6
NickT

Service.onStartCommand callback sera appelé uniquement lorsque vous démarrez votre service à l'aide de la méthode startService. Comme @NickT et @JoelF l'ont déjà souligné, vous devez appeler startService() en plus de l'appel bindService() quelque part dans votre code client (par exemple dans onCreate). 

Vous pouvez également consulter cet article (un peu ancien, mais toujours utile): " Double vie d'un service " et essayez l'exemple de l'auteur du programme fourni.

3
Idolon

Pour effectuer la communication entre service et activité. Vous pouvez également utiliser le classeur comme mentionné dans l'exemple Android officiel.

http://developer.Android.com/reference/Android/app/Service.html#LocalServiceSample

Comme les documents Android officiels suggèrent http://developer.Android.com/guide/components/services.html#StartingAService

Bien que cette documentation traite généralement de ces deux types de services séparément, votre service peut fonctionner dans les deux sens: il peut être démarré (pour une durée indéterminée) et également permettre la liaison. Il suffit simplement de mettre en œuvre plusieurs méthodes de rappel: onStartCommand () pour permettre aux composants de le démarrer et onBind () pour permettre la liaison.

Ce projet implémente ce mélange de services (BothService) et montre que, comment Service peut s'exécuter indéfiniment et permettre également la liaison avec plusieurs activités.

https://github.com/shanrais/BothService

2
shanraisshan

Si vous ajoutez le "Ongoing Notification" dans le tiroir d'applications Android, votre application et votre service ne seront pas tués.

Découvrez http://developer.Android.com/guide/topics/ui/notifiers/notifications.html

1
Abhijeet Pathak

Vous pouvez utiliser le classeur de service et créer une seule instance de connexion au niveau d'instance d'application. Dans onCreate de l'application, le service reste actif. Le service doit être un service de premier plan

0
Qumber Abbas