Donc, j'ai un service que son onDestory()
ressemble à ceci:android - si le service onDestory() n'est pas garanti, où dois-je libérer/supprimer les écouteurs, etc.?
@Override
public void onDestroy() {
super.onDestroy();
stopLocationUpdates();
googleApiClient.disconnect();
Foreground.get(this).removeListener(this);
// Here I have some code which sets shared preferences values
phoneDataManager.markLastLocation();
toastHandler.post(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(), "service onDestroy", Toast.LENGTH_SHORT).show();
}
});
}
Comme vous pouvez le voir, je passe beaucoup de choses ici (déconnexion et l'arrêt des mises à jour de l'emplacement, faire quelques changements dans la base de données SQLite, et définir certaines valeurs SharedPreferences
d'après ce que je lis, onDestory
n'est pas garanti d'être appelé un scénario que j'ai vu qu'il ne soit pas appelé est -..
l'exécution du service - application> fermeture (suppression de liste des applications) -> J'apporte le service à au premier plan en utilisant service.startForeground(1, notification);
, notification montre -> en cliquant sur l'action de notification qui déclenche une BroadcastReceiver
:
public class ServiceShutDownReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Intent serviceIntent = new Intent(context.getApplicationContext(), LocationService.class);
context.stopService(serviceIntent);
}
}
Le context.stopService(serviceIntent);
devrait appel onDestory
mais il ne est pas appelée -> donc tout le code dans onDestory
n'a pas été réalisé.
Quelle est la meilleure pratique pour ce problème? Idéalement, je veux avoir un morceau de code garanti pour être appelé lorsque le service est arrêté.
"Je veux avoir un morceau de code qui est garanti d'être appelé lorsque le service est arrêté" - qui n'existe pas. Ce qui est garanti, c'est que 'onDestroy()' sera appelé, votre processus sera terminé (dans ce cas, tous vos écouteurs et autres choses sont déjà partis), ou vous avez planté une exception non gérée. – CommonsWare
l'ai eu. Donc, à propos des préférences partagées et des choses en DB, je pense qu'il serait préférable d'avoir une autre classe dont le travail sera de faire tout cela, et l'appeler de la part de broadcastReceiver. Merci! –