153 votes

Que se passe-t-il réellement lorsque vous faites glisser une application hors de la liste des applications récentes ?

La liste des applications récentes dans Ice Cream Sandwich a ajouté la possibilité de faire glisser les applications hors de la liste, les rejetant ainsi de manière permanente (et pour autant que je sache, il s'agit d'une fonction vanille, pas d'une fonction CM/rom personnalisée). La documentation et les points forts de la plateforme ne semblent pas couvrir les rouages de cette fonctionnalité, mais je suis curieux de savoir ce que le système fait réellement.

Ajoutant à ma curiosité, j'ai décidé de faire un test rapide : J'ai démarré Music sur une installation CM9, puis j'ai fait marche arrière. J'ai ensuite vérifié la liste des applications récentes et j'ai vu qu'elle était bien là (et dans le bon état, d'après la vignette). Je suis ensuite allé dans Settings->Applications et j'ai arrêté de force l'application Musique, mais elle était toujours listée dans la liste récente, ce qui m'amène à penser que ce n'est pas lié à des processus qui traînent en arrière-plan.

Réalisant maintenant que Music était peut-être un mauvais choix, j'ai également testé l'application USA Today. Elle a présenté le même comportement, et il semble qu'elle ait été forcée de se relancer après l'arrêt forcé (ce qui est logique), bien que la vignette dans la liste des applications récentes ne le reflète pas (en cache, je suppose ?).

Que se passe-t-il réellement au niveau du système d'exploitation lorsque vous faites glisser une application hors de la liste des applications récentes ? Est-ce qu'il efface simplement les données de l'application de la mémoire vive et la met au rebut, détruisant ainsi l'état enregistré ?

83voto

David Negron Points 971

Il semble que j'ai trouvé les termes de recherche magiques qui ont conduit à des explications de la part des employés de Google. Plus précisément, j'ai trouvé deux endroits différents où Dianne Hackborn explique ce qui se passe lorsque vous faites glisser quelque chose hors de la liste récente. Le premier est un commentaire sur l'un de ses posts Google+ :

[Ce qui se passe spécifiquement lorsque vous faites glisser une tâche récente, c'est que.. : (1) il tue tout processus en arrière-plan ou vide de l'application (cf. http://developer.Android.com/guide/topics/fundamentals/processes-and-threads.html#Lifecycle pour savoir ce que cela signifie), et (2) utilise la nouvelle http://developer.Android.com/reference/Android/app/Service.html#onTaskRemoved(Android.content.Intent) pour informer les services de l'application de la tâche en cours. pour qu'il puisse faire ce qu'il pense être approprié.

Elle a également notes dans un commentaire de blog :

En fait, la suppression d'une entrée dans les tâches récentes va tuer toutes les qui existent pour le processus. Cela n'entraînera pas directement l'arrêt des services, mais il existe une API leur permettant de découvrir que la tâche a été supprimée pour décider s'ils veulent que cela signifie qu'ils doivent s'arrêter. Ainsi, la suppression de la tâche récente d'une application de courrier électronique ne n'entraînera pas l'arrêt de la vérification des e-mails.

Si vous voulez vraiment arrêter complètement une application, vous pouvez appuyer longuement sur tâches récentes pour accéder à l'information sur l'application, puis appuyer sur Forcer l'arrêt. Car l'arrêt est est un arrêt complet de l'application -- tous les processus sont tués, tous les services sont services sont arrêtés, toutes les notifications supprimées, toutes les alarmes supprimées, etc. L'application n'est pas autorisée à se relancer jusqu'à ce qu'on le lui demande explicitement.

Donc, il semble que le résumé soit que le fait de faire glisser une application hors de la liste va d'abord tuer tous les processus d'arrière-plan de l'application, puis utiliser la fonction onTaskRemoved pour informer l'application que la tâche d'arrière-plan a été supprimée. A ce stade, il semble que ce soit à l'application de décider ce qui se passe, donc je suppose qu'il y a techniquement n'est pas une règle stricte sur ce qu'il advient de l'application au-delà de ce point.

0 votes

C'est certainement un comportement non évident, très intéressant !

0 votes

"tuer tous les processus d'arrière-plan qui existent pour le processus. Cela ne provoquera pas directement l'arrêt des services". Est-ce toujours vrai ? J'ai fait un test hier. Hier, j'ai supprimé une application avec un service d'arrière-plan dans le processus principal. L'interface utilisateur d'Apps=>Running affichait 0 processus et 0 service. Plus tard, j'ai supprimé la même application avec un processus s'exécutant dans un processus spécifique à une application distincte. L'interface apps=>running a indiqué que j'avais 0 processus et 1 service. C'était sur un Moto X(2014) avec Android 4.4.4.

0 votes

@StevenWexler : Il se pourrait que le service se soit arrêté de lui-même dans le premier cas mais pas dans le second, ou il se pourrait que dans le second scénario le processus principal ait déterminé (pour une raison quelconque) qu'il ne voulait pas arrêter le service. Difficile de le savoir avec certitude.

70voto

t3rse Points 5983

Faire glisser les applications hors de la liste des applications récentes est un procédé classique, et oui, il n'est pas bien documenté. Ce sujet a fait l'objet de nombreuses discussions sur divers forums Android... le consensus semble être le mieux décrit ci-dessous. ici dans certains commentaires Il s'agit d'un comportement similaire mais pas exactement identique à la fermeture d'une application -- en général (pour les applications qui ne définissent pas de gestion explicite du bouton retour), c'est la même chose que d'appuyer suffisamment de fois sur le bouton retour à l'intérieur d'une application pour en sortir.

Le lien donne plus de détails sur les spécificités, mais dans l'ensemble, on peut considérer qu'il s'agit de quitter l'application.

Pour ce qui est de l'application Musique, je crois qu'elle démarre un service, de sorte que si la tâche elle-même (l'application/UI Musique) peut être fermée, le service continue de fonctionner en arrière-plan pour que votre musique ne s'arrête pas soudainement juste parce que la tâche a été supprimée pour des raisons de gestion de la mémoire. Cela peut avoir affecté ce que vous avez vu.

1 votes

Merci, ce lien contient beaucoup de bonnes discussions. Vous avez peut-être raison en ce qui concerne la musique, le test était peut-être médiocre. Je vais essayer une autre application, juste pour le plaisir.

2 votes

Je vais aller de l'avant et accepter ceci puisque la discussion sur Reddit m'a aidé à trouver de meilleurs termes de recherche, et semble être corroboré par certains messages de Dianne Hackborn que j'ai noté dans ma réponse . Merci !

23voto

Chris Roberts Points 7543

Il y a quelques informations dans le code source dans les classes com.Android.internal.policy.impl.RecentApplicationsBackground (arrière-plan des applications récentes) y com.Android.internal.policy.impl.RecentApplicationsDialog .

Si j'ai bien lu, il y a des gestionnaires spécifiques pour sélectionner les applications mais rien de spécial pour les faire glisser, à l'exception des éléments suivants onDetachedFromWindow() qui appelle com.android.View.onDetachedFromWindow() ce qui a pour effet de masquer l'élément et d'effacer ses données. Cela indiquerait que rien de spécial ne se produit lorsque l'on fait glisser l'application, ce qui correspond à la réponse d'Austin Mills, car puisque la liste n'affiche pas l'application active, l'élément de données de l'application est désactivé. onPause() et les autres appels système qui sont effectués lors de la "sortie" d'une application ont déjà eu lieu.

10voto

Leandros Points 820

Je pense qu'il fera la même chose que le bouton retour. Sauf un petit changement. Il va finish() toutes les activités / fragments dans l'application.

Je viens de faire un petit test avec une petite application auto-construite. Vous pouvez aussi tester. Voici mon application de test : https://bitbucket.org/Leandros99/lifecycletest (téléchargement disponible, aussi, pour ceux qui ne peuvent pas construire).
Dans chaque méthode du cycle de vie des activités ( http://developer.Android.com/reference/Android/app/Activity.html#ActivityLifecycle ) imprime un journal à l'application. Vous pouvez le visualiser avec adb logcat (installez Android SDK, cd vers platform-tools dans cmd / shell et tapez adb logcat . Maintenant vous verrez, chaque fois que vous faites quelque chose comme appuyer sur le bouton retour ou home, l'application imprime la méthode du cycle de vie, mentionnée ci-dessus).

Votre question : Si je fais glisser une application à partir du tiroir des applications récentes, la onDestroy sera appelée. Elle fait presque la même chose que le bouton retour.
J'espère avoir aidé un peu. Si vous avez des questions, n'hésitez pas à les poser.

4voto

mark Points 1689

Il ferme l'application, et ses données qui sont stockées dans la RAM. Ainsi, vous disposez de plus d'espace en mémoire vive pour exécuter d'autres applications. Toutefois, les services d'arrière-plan ne sont PAS automatiquement fermés de force à la suite de la fermeture de l'application utilisée.

1 votes

Bien qu'elle soit rédigée en langage courant, cette réponse est en fait assez précise - elle rend compte du fait que le processus est éliminé, ce qui manque à beaucoup d'autres réponses (celles qui le comparent par erreur au bouton retour). Cependant, ce qui manque ici, c'est la prise de conscience qu'Android se débarrasse des processus lorsque cela est nécessaire pour obtenir de la mémoire de toute façon, donc même s'il accomplit un certain nettoyage de la mémoire, cela se produit automatiquement si/quand cela est nécessaire.

androidalle.com

AndroidAlle est une communauté de androiders où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X