Que se passe-t-il lorsque vous effacez une application de la liste des applications récentes?

147

La liste des applications récente dans Ice Cream Sandwich a ajouté la possibilité de faire glisser des applications hors de la liste, les supprimant ainsi définitivement (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 plate-forme ne semblent pas couvrir les rouages ​​de cette fonctionnalité, mais je suis curieux de savoir ce que fait réellement le système.

Ajoutant à ma curiosité, j’ai décidé de faire un test rapide: j’ai démarré Music sur une installation CM9, puis j’ai abandonné. J'ai ensuite vérifié la liste des applications récentes et constaté qu'elle était bien là (et dans le bon état, en fonction de la vignette). Je suis ensuite entré Settings->Applicationset j'ai forcé l'application Music, mais elle figurait toujours dans la liste récente, ce qui me porte à croire qu'elle n'est pas liée à des processus en arrière-plan.

Réalisant maintenant que la musique était peut-être un mauvais choix, j'ai également testé l'application USA Today. Cela présentait fondamentalement le même comportement, et il semblait qu'il avait été forcé de "redémarrer" après l'arrêt forcé (ce qui est logique) bien que la vignette dans la liste des applications récentes ne reflète pas cela (mis en cache, je suppose?).

Alors, que se passe-t-il réellement au niveau du système d'exploitation lorsque vous faites glisser une application hors de la liste récente? Est-il simplement effacer les données de l'application de la RAM et les ordures les collecter, détruisant son état enregistré?

eldarerathis
la source

Réponses:

68

Balayer des applications de la liste des applications récentes est une vanille et, oui, pas bien documenté. Cela a fait l’objet de nombreuses discussions sur divers forums Android ... le consensus semble être mieux décrit ici dans certains commentaires : que le comportement est similaire à la fermeture d’une application, mais pas exactement la même chose, en général ( pour les applications qui ne définissent pas explicitement la gestion du bouton arrière), c'est la même chose que de revenir suffisamment de fois dans une application pour en sortir.

Le lien contient des informations plus détaillées sur les détails, mais dans l’ensemble, vous pouvez penser qu’il s’agit de quitter l’application.

En ce qui concerne l’application Musique, je pense qu’il démarre un service. Ainsi, bien que la tâche elle-même (l’application Musique / l’interface utilisateur) puisse être fermée, le service continue de s’exécuter en arrière-plan, de sorte que votre musique ne s’arrête pas subitement simplement à cause de la tâche. s'est effacé pour des raisons de gestion de la mémoire. Cela a peut-être affecté ce que vous avez vu.

Austin Mills
la source
1
Merci, ce lien a beaucoup de bonnes discussions. Vous avez peut-être aussi raison en ce qui concerne la musique, qui peut avoir été un mauvais test. Je vais essayer une autre application, juste pour les coups de pied.
eldarerathis
2
Aller de l'avant et accepter cela depuis la discussion sur reddit m'a aidé à trouver de meilleurs termes de recherche, et semblait être corroboré par certains messages de Dianne Hackborn que j'ai notés dans ma réponse . Merci!
Eldarerathis
1
Parfait, merci! Pour moi, ce post m'a aidé: reddit.com/r/Android/comments/mpevh/…
Boris Strandjev
Des lecteurs de musique tiers, tels que Rocket Player, arrêtent la musique lorsque vous glissez l'application dans la liste Récents, même si le service fonctionne en arrière-plan et que vous devez ouvrir l'application ou lire à nouveau le widget pour lancer la musique.
Heureusement, le
78

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

[Ce qui se produit spécifiquement lorsque vous effacez une tâche récente est la suivante: (1) tue tout arrière-plan ou processus vides de l'application (voir http://developer.android.com/guide/topics/fundamentals/processes-and- threads.html # Lifecycle pour ce que cela signifie) et (2) utilise la nouvelle API http://developer.android.com/reference/android/app/Service.html#onTaskRemoved(android.content.Intent) pour indiquer services de l'application sur la tâche en cours de suppression afin qu'il puisse faire tout ce qu'il juge approprié.

Elle note également dans un commentaire de blog :

En fait, la suppression d'une entrée dans les tâches récentes supprimera tous les processus d'arrière-plan existant pour le processus. Cela n'entraînera pas directement l'arrêt des services, mais une API leur permettra de savoir que la tâche a été supprimée et de décider s'ils souhaitent que cela signifie qu'ils doivent s'arrêter. Cela signifie que la suppression, par exemple, de la tâche récente d'une application de messagerie électronique ne l'empêchera pas de rechercher des messages électroniques.

Si vous voulez vraiment arrêter complètement une application, vous pouvez appuyer longuement sur les tâches récentes pour aller à l'information de l'application, et appuyer sur force stop ici. Car stop est une tuerie complète de l'application: tous les processus sont tués, tous les services sont arrêtés, toutes les notifications sont supprimées, toutes les alarmes sont supprimées, etc. L'application n'est pas autorisée à se relancer jusqu'à ce qu'elle soit explicitement demandée.

Le résumé indique donc que balayer une application hors de la liste va d'abord tuer tous les processus en arrière-plan de l'application, puis l'utiliser onTaskRemovedpour notifier à l'application que la tâche en arrière-plan a été supprimée. À ce stade, il semble que l'application ait le choix de décider de ce qui se passera, alors je suppose qu'il n'y a techniquement pas de règle stricte sur ce qu'il advient de l'application au-delà de ce point.

eldarerathis
la source
C'est certainement un comportement non évident, très intéressant!
Matthew Lu
"tuer tous les processus en 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 balayé une application avec un service d'arrière-plan dans le processus principal. Les applications => l'interface utilisateur en cours d'exécution indiquaient 0 processus et 0 service. Plus tard, j'ai balayé la même application avec un processus s'exécutant dans un processus spécifique à une application distincte. Les applications => l'interface utilisateur en cours d'exécution indiquaient que j'avais 0 processus et 1 service. C'était sur un Moto X (2014) avec Android 4.4.4.
Steven Wexler
@StevenWexler: Il se peut que le service se termine tout seul dans le premier cas mais pas dans le second ou que, dans le second scénario, le processus principal détermine (pour une raison quelconque) qu'il ne souhaite pas arrêter le service. Difficile de savoir avec certitude.
Eldarerathis
le service démarré redémarre automatiquement après avoir été balayé de la liste récente, son onCreate appelé à nouveau. mais dans certaines applications onCreate a appelé avant onTaskRemoved et dans d'autres, il a appelé après onTaskRemoved. pourquoi ce comportement est alors?
Umesh
21

Il y a quelques informations dans le code source dans les classes com.android.internal.policy.impl.RecentApplicationsBackground et com.android.internal.policy.impl.RecentApplicationsDialog .

Si je les lis correctement, il existe des gestionnaires spécifiques pour la sélection des applications, mais rien de spécial pour les glisser, à l'exception des onDetachedFromWindow()appels com.android.View.onDetachedFromWindow()qui masquent l'élément et effacent ses données. Cela laisserait supposer que rien ne se passe de particulier en balayant l'application, ce qui correspond à la réponse d'Austin Mills, car, comme la liste ne montre pas l'application active, les onPause()appels système ainsi que les autres appels système effectués lorsque vous quittez une application ont déjà arrivé.

onik
la source
10

Je pense que cela fera la même chose que le bouton de retour. Sauf un petit changement. Ce sera finish()toute activité / fragments dans l'application.

Je viens de faire un petit test avec une petite application auto-construction. Vous pouvez tester aussi. 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 de cycle de vie d'Activité ( http://developer.android.com/reference/android/app /Activity.html#ActivityLifecycle ) affiche un journal de l’application. Vous pouvez l'afficher avec adb logcat (installer Android SDK, cd sur platform-tools dans cmd / shell et taper adb logcat. Maintenant, vous verrez qu'à chaque fois que vous faites quelque chose comme un bouton de retour ou d'accueil, l'application imprime la méthode de cycle de vie, mentionnée ci-dessus. )

Votre question: Si je glisse une application dans le tiroir des applications récentes, la onDestroyméthode sera appelée. Il fait presque la même chose que le bouton Précédent.
J'espère que j'ai aidé un peu. S'il y a des questions, il suffit de demander.

Leandros
la source
3

Il ferme l'application et ses données stockées dans la RAM. Ainsi, vous disposez de plus d’espace RAM pour pouvoir exécuter d’autres applications. Cependant, les services d'arrière-plan NE sont PAS forcés de fermer automatiquement à la suite de la fermeture de l'application utilisant.

utilisateur3067986
la source
1
Bien qu’elle soit écrite dans un langage courant, c’est en réalité une réponse assez précise: elle rend compte du fait que le processus est éliminé, il manque beaucoup d’autres réponses (celles qui le comparent par erreur au bouton de retour). Cependant, ce qui manque ici, c’est que nous réalisons qu’Android disposera de tous les processus nécessaires pour obtenir de la mémoire. Ainsi, même s’il effectue un nettoyage de la mémoire, cela se produirait automatiquement si nécessaire.
Chris Stratton