Bonjour, j'ai créé une application dont le but est d'enregistrer à intervalles réguliers une localisation GPS dans une base SQLITE ; cet enregistrement est effectué via un service, qui me semble être l'objet le plus approprié. j'ai deux problèmes :

- Je lance une activité, qui lance un service initialisant un listener GPS, qui lui-même implémente une base SQLITE correctement (LAT, LON, etc) tant que l'activité est au premier plan
- quand l'activité quitte le premier plan (appel téléphonique, changement d'application, écran principal du téléphone, etc), mon service est toujours vivant, mais son listener est inactif tant que je n'ai pas remis l'activité au premier plan
- si je tue l'activité, le service est bien toujours actif, mais son listener ne réagit plus.

Précisions : quand l'activité passe au second plan, je constate que le service est tué, puis recréé aussitôt via le STICKY. Mon application est paramétrée comme application non optimisée pour la batterie ; dans le manifest, j'ai fait le choix d'un processus séparé pour le service (mais ça n'a rien changé) :

ANDROIDMANIFEST
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
 
<service
            android:name=".MyService"
            android:screenOrientation="portrait"
            android:enabled="true"
            android:exported="true"
            android:process=":externalProcess"
            ></service>

ACTIVITY :
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
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
 
    Button start, stop;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
        setContentView(R.layout.activity_main);
        start=findViewById(R.id.start);
        stop=findViewById(R.id.stop);
        start.setOnClickListener(this);
        stop.setOnClickListener(this);
        ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 1);
 
    }
    public void onClick(View view) {
 
        if(view == start){
                   startService(new Intent(getBaseContext(), MyService.class ) );
        }
 
        else if (view == stop){
            stopService(new Intent(getBaseContext(),MyService.class ) );
        }
    }
 
    public void onDestroy() {
        super.onDestroy();
        getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
    }
}
MON SERVICE :

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
public class MyService extends Service implements LocationListener {
 
    static LocationManager locationManager;
    public Context context=this;
 
    @SuppressLint("MissingPermission")
    @Override
 
    public int onStartCommand(Intent intent, int flags, int startId) {
 
        locationManager = (LocationManager) this.getSystemService(LOCATION_SERVICE);
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 7000, 1, this);
        return START_STICKY;
    }
 
    @Override
 
    public void onDestroy() {
        super.onDestroy();
        locationManager.removeUpdates(this);
        locationManager=null;
    }
 
    @Nullable
    @Override
 
    public IBinder onBind(Intent intent) {
        throw new UnsupportedOperationException("Not yet implemented");
    }
 
    @Override
    public void onLocationChanged(@NonNull Location location) {
            db = SQLiteDatabase.openDatabase("/data/data/com.example.testservice/databases/TRACES_LOCAL_40.db", null, SQLiteDatabase.OPEN_READWRITE);
            DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            Date date = new Date();
            String dtf = format.format(date);
            ContentValues values = new ContentValues();
            values.put("LAT",location.getLatitude());
            values.put("LON", location.getLongitude());
            values.put("DATE_CREATION", dtf);
            db.insert("TRACES", null, values);
            db.close();
            values.clear();
    }
 
    public void onProviderDisabled(final String provider) {
    }
 
    public void onProviderEnabled(final String provider) {
    }
 
    public void onStatusChanged(final String arg0, final int arg1, final Bundle arg2) {
 
    }
}
Voilà, merci de votre aide, je n'avance plus...

Cordialement,
Marc