130 votes

Comment gérer l'exécution d'un service lorsque l'application est tuée en la faisant glisser sur Android?

Si mon application est en cours d'exécution et que j'appuie sur le bouton d'accueil, l'application passe en arrière-plan. Maintenant, si je maintiens enfoncé le bouton d'accueil et que je tue l'application en la faisant glisser de la liste des applications récentes, aucun des événements tels que onPause(), onStop() ou onDestroy() n'est appelé, mais le processus est terminé.

Donc, si je veux arrêter mes services, fermer les notifications et désinscrire les auditeurs, comment puis-je faire cela?

181voto

Dhruti Points 7625

J'ai résolu un problème similaire.

Voici ce que vous pouvez faire si c'est juste une question d'arrêt du service lorsque l'application est arrêtée en la faisant glisser depuis la liste des applications récentes.

À l'intérieur de votre fichier Manifest, gardez le drapeau stopWithTask comme true pour le Service. Comme ci-dessous:

Mais comme vous dites que vous voulez annuler les écouteurs et arrêter les notifications, etc., je suggèrerais cette approche:

  1. À l'intérieur de votre fichier Manifest, gardez le drapeau stopWithTask comme false pour le Service. Comme ci-dessous:

  2. Maintenant dans votre service MyService, remplacez la méthode onTaskRemoved. (Cela ne sera déclenché que si stopWithTask est défini sur false).

     public void onTaskRemoved(Intent rootIntent) {
    
         //annuler les écouteurs
         //effectuer tout autre nettoyage si nécessaire
    
         //arrêter le service
         stopSelf();  
     }

Référez-vous à ma question pour plus de détails, qui contient également une autre partie du code.

38voto

emilpmp Points 554

Nous devons créer un service qui effacerait l'application des services récents

public class ClearService extends Service {

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

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d("ClearService", "Service Started");
        return START_NOT_STICKY;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.d("ClearService", "Service Destroyed");
    }

    @Override
    public void onTaskRemoved(Intent rootIntent) {
        Log.e("ClearService", "END");
        //Code here
        stopSelf();
    }
}
  1. enregistrer ce service dans manifest.xml

  2. Ensuite, démarrez ce service sur votre activité de démarrage

    startService(new Intent(getBaseContext(), ClearService.class));

Et maintenant, chaque fois que vous viderez votre application des services récents Android, alors cette méthode onTaskRemoved() s'exécutera.

20voto

Anshul Agarwal Points 744

J'ai résolu un problème similaire. Si vous voulez qu'après avoir basculé depuis la tâche récente et au prochain lancement, il se comporte correctement, suivez les étapes ci-dessous :-

1) Enregistrer l'ID du processus dans les préférences partagées :

SharedPreferencesUtils.getInstance().putInt(SharedPreferencesUtils.APP_PROCESS_ID, android.os.Process.myPid());

2) Lorsque l'application est lancée depuis le lanceur après avoir été effacée de la tâche récente, faites ceci :

int previousProcessID = mSharedPreferencesUtils.getInt(SharedPreferencesUtils.APP_PROCESS_ID);

int currentProcessID = android.os.Process.myPid();

if ((previousProcessID == currentProcessID)) {
    // Cela garantit que l'application n'a pas encore été arrêtée, que ce soit en effaçant la tâche récente ou autrement
} else {
    // Cela garantit que l'application a été arrêtée, que ce soit en effaçant la tâche récente ou par tout autre moyen
}

6voto

Desert Points 2263

Lorsque vous appuyez sur Accueil - onPause et onStop de votre Activity est appelé, donc à ce moment vous devez effectuer toutes les sauvegardes et le nettoyage, car la plateforme Android ne garantit pas davantage que onDestroy ou toute autre méthode du cycle de vie serait invoquée, donc le processus pourrait être arrêté sans aucune notification.

3voto

Bob Cram Points 99

ViewModel.onCleared() peut être utile, si le but est de libérer une ressource (peut-être un système fonctionnant quelque part ailleurs sur le réseau) lorsque l'utilisateur quitte de manière inattendue en balayant, plutôt qu'en appuyant sur le bouton "arrêter". [C'est ainsi que j'ai initialement posé cette question].

L'application ne reçoit pas de notification, et Activity.onDestroy() est appelée pour les changements de configuration tels que les changements d'orientation, donc la réponse n'est pas là. Mais ViewModel.onCleared est appelé lorsque l'application est balayée (ainsi que lorsque l'utilisateur sort de l'activité). Si la ressource que vous souhaitez utiliser est associée à plus d'une activité dans la pile, vous pouvez ajouter des compteurs de référence ou un autre mécanisme pour décider si ViewModel.onClear doit libérer la ressource.

C'est encore une autre de nombreuses bonnes raisons d'utiliser le modèle ViewModel

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X