Я не могу остановить свою службу (обновить мое местоположение) в моем приложении для Android! - PullRequest
3 голосов
/ 04 марта 2011

Я внедрил Службу, которая обновляет мое текущее местоположение и отправляет его на мой Сервер.Я использую только с ToggleButton: startService () для вызова службы и stopService () для ее остановки.Я видел в logCat, что служба продолжает работать после вызова stopService, потому что когда я перезапускаю службу, она обновляет мое местоположение два (три ... или четыре ...) раза.

Мой код:

Сервис: Geolocalisation.java

public class Geolocalisation extends Service{

private LocationManager locationManager;
//private String locationProvider = LocationManager.NETWORK_PROVIDER;
private String locationProvider = LocationManager.NETWORK_PROVIDER;

@Override
public void onCreate(){

    System.out.println("Service en cours !!");

    //Recuperation Location
    String locationContext = Context.LOCATION_SERVICE;
    locationManager = (LocationManager) getSystemService(locationContext);
    if (locationManager != null && locationProvider != null) {

        majCoordonnes();
        locationManager.requestLocationUpdates(locationProvider, 10000, 0, new MajListener());

    }

}

@Override
public void onStart(Intent intent, int StartId){
    System.out.println("Service commence !!");
    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
    SharedPreferences.Editor editor = preferences.edit();
    editor.putBoolean("geo", true);
    editor.commit();    
}

@Override
public void onDestroy(){
    System.out.println("Service détruit !!");
    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
    SharedPreferences.Editor editor = preferences.edit();
    editor.putBoolean("geo", false);
    editor.commit();    

}

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


public void majCoordonnes() {
    StringBuilder stringBuilder = new StringBuilder("Fournisseur :");
    stringBuilder.append("\n");
    stringBuilder.append(locationProvider);
    stringBuilder.append(" : ");
    Location location = locationManager.getLastKnownLocation(locationProvider);

    if (location != null) {

        double latitude = location.getLatitude();
        double longitude = location.getLongitude();

        String lat = String.valueOf(latitude);
        String lon = String.valueOf(longitude);

        stringBuilder.append(latitude);
        stringBuilder.append(", ");
        stringBuilder.append(longitude);

        //Send location to server
        new sendLocation().execute(lat, lon);

        System.out.println("Localisation:  "+ lat +" "+lon );


    } else {
        stringBuilder.append("Non déterminée");
    }
    //Log.d("MaPositionMaj", stringBuilder.toString());
}


/**
 * Ecouteur utilisé pour les mises à jour des coordonnées
 */
class MajListener implements android.location.LocationListener {

    public void onLocationChanged(Location location) {
        majCoordonnes();
        System.out.println("Update geo!");
    }
    public void onProviderDisabled(String provider){
    }
    public void onProviderEnabled(String provider){
    }
    public void onStatusChanged(String provider, int status, Bundle extras){
    }
};

Мой Main.java, который вызывает и уничтожает сервис с помощью ToggleButton:

intentGeo = new Intent().setClass(this,Geolocalisation.class);

    Boolean boolLog = preferences.getBoolean("geo", false);

    final ToggleButton toggleAge = (ToggleButton) findViewById(R.id.ToggleGeo);

    //Check ToggleButton if the service is already running
    if( boolLog != true){
        try{
            toggleAge.setChecked(false);

        }catch (Exception e){
            System.out.println("Service Error");
        }       
    } else {
        toggleAge.setChecked(true);
    }

    //Activer ou désactivé le service de géolocalisation
    toggleAge.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            // Perform action on clicks
            if (toggleAge.isChecked()) {

                try{
                    startService(intentGeo);
                    System.out.println("Turn ON");
                }catch (Exception e){
                    System.out.println("Service Error");
                }

            } else {

                try{
                    stopService(intentGeo);
                    System.out.println("Turn OFF");
                }catch (Exception e){
                    System.out.println("Service Error");
                }
            }
        }
    });

Спасибо за вашу помощь!

PS Я использую Sharedpreference, чтобы определить, запущена служба или нет.Но если происходит сбой службы, возникает проблема.Как я могу проверить состояние моей службы?

Ответы [ 3 ]

2 голосов
/ 04 марта 2011

В вашей функции onDestroy из Geolocalisation.java вы не заканчиваете прослушиватель, вы просто изменяете переменную, которую ваша программа проверяет, работает ли служба или нет.Вы можете добавить код здесь, чтобы предотвратить дальнейшее выполнение слушателя местоположения.

locationManager.removeUpdates (locationProvider);

должен добиться цели.

2 голосов
/ 04 марта 2011

Вам не нужно запускать и останавливать службу самостоятельно. Вы можете привязать свою активность к службе, а затем использовать методы своей службы, чтобы остановить или запустить ее.

Чтобы привязать к сервису, вам нужно использовать что-то подобное из своей деятельности, вероятно, в onCreate:

Intent serviceIntent = new Intent();
serviceIntent.setClass(this, YourService.class);
bindService(serviceIntent, connection, Context.BIND_AUTO_CREATE);

Есть несколько других шаблонных вещей, которые вам нужно будет сделать, описанных здесь . Как только ваша деятельность связана со службой, вы можете остановить и запустить ее, используя методы класса обслуживания через ссылку на конкретный объект.

Просто не забудьте отсоединиться от сервиса, когда ваша активность разрушится!

unbindService(connection);
0 голосов
/ 04 марта 2011

Чтобы прекратить обновление сервера, возможно, вам следует заменить функцию stopService на код остановки?

@Override
public stopService(Intent service)
{
    super.stopService();
    // code to stop updating server
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...