Bonsoir tout le monde j'ai un gros souçis avec le GPS Android.

J'ai crée une activité MainActivity avec un bouton qui lance l'activité WalkWithPet qui s'occupe de récupérer le nombre de mètre parcourus.

Sauf que si je lance l'activité WalkWithPet, que je ferme cette activité avec finish() l'instance du GPS continue quand même d'exister ce qui fait que si je relance cette activité il y aura deux instance de GPS et donc un dédoublement du nombre de mètres parcourus (Et si je relance 8 fois l'activité ce sera fois 8...)

Pour avoir deviné ce souçis j'avais créer une propriété onLocationChanged avec dedans un toast et même quand l'activité avait été fermée avec Finish je continuais de recevoir les toast.

J'ai donc modifié la propriété onDestroy() qui va désenregistrer le GPS mais je ne comprends pas pourquoi un simple finish (qui détruit l'activité en cours) ne détruit pas le GPS.

Voici mon code

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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
package com.caranille.myownpet;
 
import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Build;
import android.support.annotation.RequiresApi;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
 
import com.caranille.myownpet.DB.DBPetManage;
 
public class WalkWithPetActivity extends AppCompatActivity implements LocationListener {
 
    private LocationManager locationManager;
    private Location oldlocation;
    private Location newlocation;
    private int oldTimeStamp;
    private int newTimeStamp;
    private int differenceTimeStamp;
    private int limiteTimeStamp = 10;
    private int distance;
    private int step = 0;
    private int xp = 0;
    private int i;
 
    private Button Back;
    private TextView latitude;
    private TextView longitude;
    private TextView newlatitude;
    private TextView newlongitude;
    private TextView experience;
    static Pets pets;
    static DBPetManage dbPetManage;
 
    @RequiresApi(api = Build.VERSION_CODES.M)
    @Override
    protected void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_walk_with_pet);
 
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED)
        {
            if (Build.VERSION.SDK_INT >= 23) {
                if (shouldShowRequestPermissionRationale(Manifest.permission.ACCESS_FINE_LOCATION) && shouldShowRequestPermissionRationale(Manifest.permission.ACCESS_COARSE_LOCATION) == true)
                {
 
                }
                else
                {
                    requestPermissions(new String[] { Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION  } , 2);
                }
            }
        }
 
        dbPetManage = new DBPetManage(this);
        dbPetManage.open();
        pets = dbPetManage.NewPet();
 
        latitude = (TextView) findViewById(R.id.latitude);
        longitude = (TextView) findViewById(R.id.longitude);
        newlatitude = (TextView) findViewById(R.id.newlatitude);
        newlongitude = (TextView) findViewById(R.id.newlongitude);
        experience = (TextView) findViewById(R.id.experience);
        Back = (Button)findViewById(R.id.Back);
 
        locationManager = (LocationManager) this.getSystemService(LOCATION_SERVICE);
        if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) { registerGPS(); }
 
        Back.setOnClickListener(new Button.OnClickListener()
        {
            public void onClick(View v)
            {
                finish();
                Intent intent = new Intent(WalkWithPetActivity.this, MainPetActivity.class);
                startActivity(intent);
            }
        });
    }
 
    @Override
    public void onResume() {
        super.onResume();
    }
 
    @Override
    public void onPause() {
        super.onPause();
    }
 
    public void registerGPS() {
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            return;
        }
        Toast.makeText(getApplicationContext(), "Activation du suivit GPS", Toast.LENGTH_LONG).show();
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 10, this);
    }
 
    public void unregisterGPS() {
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            return;
        }
        locationManager.removeUpdates(this);
    }
 
    @Override
    public void onLocationChanged(final Location location) {
 
        newTimeStamp = (int) System.currentTimeMillis() / 1000;
 
        //Première étape on rempli les variable oldlocation et oldTimeStamp avec les valeurs par défaut
        if (step == 0)
        {
            oldlocation = location;
            oldTimeStamp = (int) System.currentTimeMillis() / 1000;
            step++;
 
            latitude.setText("" + oldlocation.getLatitude());
            longitude.setText("" + oldlocation.getLongitude());
            experience.setText("" + xp);
        }
 
        //Si les valeurs par défaut sont remplie on fait la différence avec les nouvelles valeurs
        else
        {
            newlocation = location;
            differenceTimeStamp = newTimeStamp - oldTimeStamp;
            oldTimeStamp = (int) System.currentTimeMillis() / 1000;
 
            //Si cela fait dix secondes ou plus que la position n'a pas été actualisée l'expérience est bloquée.
            //Exemple: Eviter qu'une personne prenne le train et fasse plusieurs
            if (differenceTimeStamp >= limiteTimeStamp) {
                xp += 0;
                newlatitude.setText("" + newlocation.getLatitude());
                newlongitude.setText("" + newlocation.getLongitude());
                oldlocation = location;
            }
            else
            {
                distance = (int) oldlocation.distanceTo(newlocation);
                pets.setExperience(pets.getExperience() + distance);
                newlatitude.setText("" + newlocation.getLatitude());
                newlongitude.setText("" + newlocation.getLongitude());
                oldlocation = location;
                xp += distance;
            }
        }
        latitude.setText("" + oldlocation.getLatitude());
        longitude.setText("" + oldlocation.getLongitude());
        experience.setText("" + xp);
 
        dbPetManage.open();
        dbPetManage.SavePet(pets);
    }
 
    @Override
    public void onProviderDisabled(final String provider) {
        //Si le GPS est désactivé on se désabonne
        if("gps".equals(provider)) {
            unregisterGPS();
        }
    }
 
    @Override
    public void onProviderEnabled(final String provider) {
        //Si le GPS est activé on s'abonne
        if("gps".equals(provider)) {
            registerGPS();
        }
    }
 
    @Override
    public void onStatusChanged(final String provider, final int status, final Bundle extras) { }
 
    @Override
    public void onDestroy()
    {
        super.onDestroy();
        unregisterGPS();
        Toast.makeText(getApplicationContext(), "Désactivation du suivit GPS", Toast.LENGTH_LONG).show();
    }
}
Avec ce code quand je quitte l'activité je ne reçoit plus de toast (Donc le GPS ne semble plus fonctionner) mais quand je la relance je trouves quand même que le GPS s'actualise plus souvent (Après c'est peut être un hasard)

Ma question est comment détruire cette activité ainsi que toutes les ressources qu'elle a crée ?

Merci énormément de votre aide et bonne soirée

Cordialement,