Aller au contenu

Activity, Service, Handler, Looper...


MikaelPeigney

Recommended Posts

Salut,

Je souhaite pouvoir obtenir la position d'un utilisateur via un service.

Pour cela, j'ai donc créé mon service, jusque là pas de soucis.

Toute fois, je me suis rendu compte que LocationManager.requestLocationUpdates (String provider, long minTime, float minDistance, LocationListener listener) demandait que la classe appelante soit un Looper... Tant qu'on est dans un Activity, ça va, mais quand on passe à un Service, on y est plus !

Du coup, je me suis un peu perdu, je crois en tout cas...

J'ai besoin d'un service, qui appelle un Looper, qui lui même appelle le requestLocationUpdates()... Par divers codes sur internet, j'en suis arrivé à ça :

package me.mika56.carnetaac;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Binder;
import android.os.Process;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.IBinder;
import android.os.Looper;
import android.os.Message;
import android.widget.Toast;
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;

private Looper mServiceLooper;
private ServiceHandler mServiceHandler;

private final class ServiceHandler extends Handler
{

 private LocationManager lm;
 private LocationListener locationListener;

 public ServiceHandler(Looper looper) {
  super(looper);
  lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
  locationListener = new MyLocationListener();
 }

 @Override
 public void handleMessage(Message msg)
 {
  if (msg.obj.equals("turnOnDrivingMode"))
  {
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 10000, 10, locationListener);
  }
  else if(msg.obj.equals("turnOffDrivingMode"))
  {
((MyLocationListener) locationListener).saveTrip();
lm.removeUpdates(locationListener);
  }
 }
}

@Override
public void onCreate()
{
 serviceStarted = true;

 HandlerThread thread = new HandlerThread("ServiceStartArguments", Process.THREAD_PRIORITY_BACKGROUND);
 thread.start();
 mServiceLooper = thread.getLooper();
 mServiceHandler = new ServiceHandler(mServiceLooper);
}

@Override
public int onStartCommand(Intent intent, int flags, int startId)
{
 return mStartMode;
}

@Override
public IBinder onBind(Intent arg0)
{
 return mBinder;
}

@Override
public boolean onUnbind(Intent intent)
{
 return allowRebind;
}

@Override
public void onRebind(Intent intent)
{
}

@Override
public void onDestroy()
{
 serviceStarted = false;
}

public void turnOnDrivingMode()
{
 Message msg = mServiceHandler.obtainMessage();
 msg.obj = "turnOnDrivingMode";
 mServiceHandler.sendMessage(msg);
}

public void turnOffDrivingMode()
{
 Message msg = mServiceHandler.obtainMessage();
 msg.obj = "turnOffDrivingMode";
 mServiceHandler.sendMessage(msg);
}

public class LocalBinder extends Binder
{
 MainService getService()
 {
  return MainService.this;
 }
}
}

Au final, quand je fais donc un turnOnDrivingMode(), le GPS s'active (il clignote dans la barre en haut), mais il se passe ensuite quelque chose de bizarre... Le réseau s'active (3G), alors que le Wifi l'est déjà, puis se désactive, et coupe le GPS... Dafuq ?

Voilà, je pense que je me suis bien emmêlé les pinceaux avec tout ça, alors si quelqu'un pouvait m'aider à me dépatouiller :)

Mika.

Lien vers le commentaire
Partager sur d’autres sites

Personne n'a la moindre idée ? :(

Mika.

Edit : C'est à ne plus y rien comprendre !

J'ai refait mon code, sans Handler ni Looper, et maintenant ça marche !

Bug du téléphone ? Le service qui se serait mal mit à jour à l'installation de l'APK ? Ou un truc que j'ai modifié dans le code sans m'en rendre compte ?

Bref, voici ce que ça donne, le plus simplement du monde :

import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.location.LocationListener;
import android.location.LocationManager;
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;

private LocationManager lm;
private LocationListener locationListener;

@Override
public void onCreate()
{
 System.out.println("The service is being created");
 serviceStarted = true;
 lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
 locationListener = new MyLocationListener();
}

@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 turnOnDrivingMode()
{
 System.out.println("MainServer.turnOnDrivingMode();");
 lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 10000, 10, locationListener);
}

public void turnOffDrivingMode()
{
 System.out.println("MainServer.turnOffDrivingMode();");
 lm.removeUpdates(locationListener);
}

public class LocalBinder extends Binder
{
 MainService getService()
 {
  return MainService.this;
 }
}
}

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...