2010-08-14 5 views
0

J'ai un service en cours d'exécution sur mon application android, le service est une classe socket qui doit courir à travers toute l'application, je crée quand mes premières charges d'activité. Comment puis-je obtenir une instance de cette classe de socket afin que je puisse appeler une fonction dans cette classe.Android ==> Question de service?

For example 
//how can i get an instance of the running service? 
MyService s = getService(); 
s.writeDataToServer("hello"); 

Répondre

1

Le langage de définition d'interface Android (AIDL) est la manière correcte de se connecter à un service.

Découvrez http://developer.android.com/guide/developing/tools/aidl.html

Pour plus d'informations comment communiquer avec un service.

+0

1 question, la façon dont je suis en train de traiter cette (communication entre le service et l'activité), est en faisant chaque objet et méthode dans mon service statique. Est-ce une mauvaise façon de communiquer avec un service? par exemple chaque fois qu'un des charges d'activité que je fais MyService.setMainActivity (this); donc je passe une instance de mon activité à une variable statique que j'ai dans ma classe de service. Et quand je veux envoyer un message à mon serveur à partir de mon activité, j'appelle la méthode statique que j'ai dans ma classe de service. MyService.SendDataToServer ("bonjour"); Est-ce une mauvaise façon de communiquer avec mon service? – aryaxt

+3

Oui, c'est vraiment une mauvaise façon de faire les choses. Le service ou l'activité pourrait être tué sans que vous le sachiez. Toutefois, si vous utilisez le framework IPC intégré à Android, il s'assurera que cela ne se produira pas ou, s'il le fait, il le gérera avec élégance. A long terme, l'utilisation de l'interface AIDL est beaucoup plus facile. Cela peut sembler intimidant, mais c'est plutôt facile si vous passez quelques minutes à le lire. –

+0

Pourquoi le vote à la baisse? –

2

Il y a deux façons vous pouvez aller à faire cela en fonction de si vous voulez garder la prise ouverte lorsque l'utilisateur ne l'utilisez pas votre interface utilisateur.

Le premier est un LocalService c'est la même que celle d'un Service régulier, sauf qu'il fonctionne dans le même processus que votre thread d'interface utilisateur de Activity et, par conséquent, vous pouvez obtenir une référence directe à elle. C'est une méthode beaucoup plus légère de créer et d'utiliser un service que d'utiliser AIDL. Je recommande uniquement l'utilisation d'AIDL si vous souhaitez créer un service hors processus qui doit être accessible par différents processus dans votre application ou dans différentes applications. Ce n'est probablement pas ce dont vous avez besoin. La méthode LocalService vous permet de maintenir le service en arrière-plan et de garder le socket ouvert même lorsque l'interface utilisateur n'est pas utilisée.

Si vous n'avez pas l'obligation de garder le socket ouvert et souhaitez seulement y accéder depuis plusieurs Activity s alors vous pouvez étendre la classe Application et l'enregistrer dans votre manifeste. Il vous permet de gérer l'état global de l'application. Vous pouvez placer les fonctions de création et de gestion de socket dans cette classe, puis fournir des méthodes pour que vos différents Activity s y accèdent. La classe Application meurt lorsque le processus meurt. Il n'est donc pas recommandé de laisser une socket ouverte pendant de longues périodes ou lorsque l'utilisateur n'utilise pas activement votre application.

Il est intégré dans la méthode Activity#getApplication() qui aide à ce processus. Vous pouvez spécifier votre classe personnalisée Application dans le fichier AndroidManifest.xml via l'attribut android:name.

+0

1 question à propos de LocalService, suis-je capable de faire tourner le service tout en naviguant entre les activités? Chaque activité dans mon application montre des données basées sur ce que je reçois du serveur, et tout est basé sur la session (session de demande, connexion, etc) de sorte que le socket doit être connecté tout le temps. – aryaxt

+1

Oui, vous pouvez appeler startService ou bindService avec BIND_AUTO_CREATE. Dans ce cas, vous devrez gérer vous-même l'arrêt du service. – Qberticus