IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

Un peu perdu sur les Services !


Sujet :

Android

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2009
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2009
    Messages : 19
    Points : 28
    Points
    28
    Par défaut Un peu perdu sur les Services !
    Salut,

    Je voudrais, dans mon application, avoir un service de fond.
    Ce service suit la position GPS de l'utilisateur et fait plusieurs calculs. En fait, j'ai besoin que cela reste en fond, car l'utilisateur peut très bien éteindre son téléphone (j'espère pour lui qu'il ne le regarde pas quand il conduit !), ou Android peut décider de fermer le thread de mon appli.

    Mon but est donc de pouvoir me "connecter" à mon service à la demande, depuis mon Activity principale, ou bien depuis un Widget.

    Toute fois, je suis un peu perdu... Je pense avoir bien comprit le principe des Services, mais je voudrais en lancer un en fond, et pouvoir m'y connecter/déconnecter à la volée, sans le lancer plusieurs fois.
    D'après la documentation, BindService() semble tuer le Service une fois toutes les instances déconnectées, et utiliser startService() me permet pas de le récupérer ailleurs...

    J'ai manqué quelque chose ?

    Mika.

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2009
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2009
    Messages : 19
    Points : 28
    Points
    28
    Par défaut
    Après quelques temps à chercher, j'ai finit par trouver !
    En fait, pour qu'Android permette de binder le service, tout en le gardant lancé quand tous les clients sont déconnectés, il faut implémenter à la fois onCreate() et onBind(). Ensuite, il faut lancer une fois onCreate(), puis se "connecter" au service via onBind().

    Le soucis, c'est que Android ne permet pas de savoir si un service est déjà lancé, donc dois-je d'abord utiliser onCreate(), ou l'avais-je déjà fait avant... Encore plus valable si j'ai fait un .finish() sur mon Activity, dans ce cas, je ne sais plus où j'en suis.

    Du coup, utiliser un boolean en static sur la classe du Service, mit à true sur onCreate(), false sur onDestroy(), et le tour est joué.

    Voilà la classe que j'ai utilisé pour mes tests :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
     
    import android.app.Service;
    import android.content.Intent;
    import android.os.Binder;
    import android.os.IBinder;
     
    public class MainService extends Service
    {
    	public static boolean serviceStarted = false;
     
    	private final int mStartMode = Service.START_NOT_STICKY;
    	private final LocalBinder mBinder = new LocalBinder();
    	private final boolean allowRebind = true;
     
    	@Override
    	public void onCreate()
    	{
    		System.out.println("The service is being created");
    		serviceStarted = true;
    	}
    	@Override
    	public int onStartCommand(Intent intent, int flags, int startId)
    	{
    		System.out.println("The service is starting, due to a call to startService()");
    		return mStartMode;
    	}
    	@Override
    	public IBinder onBind(Intent arg0)
    	{
    		System.out.println("A client is binding to the service with bindService()");
    		return mBinder;
    	}
    	@Override
    	public boolean onUnbind(Intent intent)
    	{
    		System.out.println("All clients have unbound with unbindService()");
    		return allowRebind;
    	}
    	@Override
    	public void onRebind(Intent intent)
    	{
    		System.out.println("A client is binding to the service with bindService(), after onUnbind() has already been called");
    	}
    	@Override
    	public void onDestroy()
    	{
    		System.out.println("The service is no longer used and is being destroyed");
    		serviceStarted = false;
    	}
     
    	public void test()
    	{
    		System.out.println("Test !");
    	}
     
    	public class LocalBinder extends Binder
    	{
    		MainService getService()
    		{
    			return MainService.this;
    		}
    	}
    }
    Du coup, pour se "connecter" au service, il faut faire quelque chose du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    MainService mService;
    boolean mBound = false;
    private ServiceConnection mConnection = new ServiceConnection()
    {
    	public void onServiceConnected(ComponentName className, IBinder service)
    	{
    		LocalBinder binder = (LocalBinder) service;
    		mService = binder.getService();
    		mBound = true;
    	}
     
    	public void onServiceDisconnected(ComponentName arg0)
    	{
    		mBound = false;
    	}
    };
    intent = new Intent(this, MainService.class);
    if(!MainService.serviceStarted)
    {
    	startService(intent);
    }
    bindService(intentBound, mConnection, 0);
    Tout marche pour moi

    Mika.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. un peu perdu sur les bdd
    Par skysee dans le forum ASP.NET
    Réponses: 2
    Dernier message: 24/08/2008, 13h14
  2. Suggestion sur les services offertent sur un site intranet!
    Par ghyosmik dans le forum Général Conception Web
    Réponses: 3
    Dernier message: 30/01/2006, 17h14
  3. Question sur les services windows
    Par bilb0t dans le forum Windows
    Réponses: 8
    Dernier message: 09/11/2005, 16h31
  4. Réponses: 5
    Dernier message: 13/06/2005, 18h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo