Dans Android O (8.0.0+) (API 26+), Comment obtenir une mise à jour de services de localisation lorsque l'application est en arrière-plan ou en mode mort? Dans l'application Android "Strava" (disponible sur Play Store ), les services de localisation s'exécutent correctement lorsque l'application est en arrière-plan ou qu'elle est inactive. Je dois créer la même fonctionnalité dans mon application . Chaque fois que je lance le service en utilisant
startService(new Intent(this, GpsServices.class));
Ensuite, la méthode onDestroy est appelée après 10 secondes lorsqu'une application est en mode inactif (l'application est en arrière-plan ou kill). Ci-dessous mon code.
public class GpsServices extends Service implements LocationListener, Listener {
@Override
public void onCreate() {
mLocationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
return;
}
if (mLocationManager != null) {
mLocationManager.addGpsStatusListener(this);
}
if (mLocationManager != null) {
mLocationManager.requestLocationUpdates(
LocationManager.GPS_PROVIDER,
500,
0,
this);
}
}
public void onLocationChanged(Location location) {
System.out.println("location = [" + location + "]");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// If we get killed, after returning from here, restart
return START_STICKY;
}
@Override
public IBinder onBind(Intent intent) {
// We don't provide binding, so return null
return null;
}
/* Remove the locationlistener updates when Services is stopped */
@Override
public void onDestroy() {
try {
mLocationManager.removeUpdates(this);
mLocationManager.removeGpsStatusListener(this);
stopForeground(true);
} catch (Exception e) {
e.printStackTrace();
}
}
}
Toute aide serait appréciée.
Vous pouvez essayer l'une des deux options ci-dessous ou une combinaison des deux, ce qui a résolu mes problèmes quand je les ai affrontés.
Pour que la mise à jour de l'emplacement continue de fonctionner en arrière-plan, vous devez utiliser LocationServices
API avec FusedLocationProviderClient
comme décrit ici et ici dans docs ou ici dans CODEPATH.
Si vous aviez correctement lu la documentation Android Oreo 8.0 quelque part dans ici , vous auriez atterri sur cette solution.
Étape 1: Assurez-vous de démarrer un service en tant que service de premier plan, comme indiqué dans le code ci-dessous.
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
mainActivity.startService(new Intent(getContext(), GpsServices.class));
mainActivity.startService(new Intent(getContext(), BluetoothService.class));
mainActivity.startService(new Intent(getContext(), BackgroundApiService.class));
}
else {
mainActivity.startForegroundService(new Intent(getContext(), GpsServices.class));
mainActivity.startForegroundService(new Intent(getContext(), BluetoothService.class));
mainActivity.startForegroundService(new Intent(getContext(), BackgroundApiService.class));
}
Étape 2: Utilisez la notification pour indiquer que votre service est en cours d'exécution. Ajouter la ligne de code ci-dessous dans la méthode de service
onCreate
.
@Override
public void onCreate() {
...
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
startForeground(NOTIFICATION_ID, notification);
}
...
}
Étape 3: Supprimez la
notification
lorsque le service est arrêté ou détruit.
@Override
public void onDestroy() {
...
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
stopForeground(true); //true will remove notification
}
...
}
Un problème avec Option 2 est qu'il continue d'afficher la notification
jusqu'à ce que votre GpsService
s'exécute sur tous les périphériques fonctionnant sous Android Oreo 8.0.
Je suis sûr que ces deux options fonctionneront même lorsque l'application est en arrière-plan ou en mode kill.
J'espère que cette solution pourra résoudre votre problème.
La solution pour résoudre ce problème semble être un générateur de notification. Le lien suivant décrit une solution qui fonctionne mieux que je ne peux en résumer:
https://hackernoon.com/Android-location-tracking-with-a-service-80940218f561