Répondre à la pression de la mémoire

Le système Android mettra fin aux applications sans avertissement afin de libérer les ressources requises par toutes les applications actives et visibles. Pour offrir la meilleure expérience utilisateur possible, Android doit trouver un équilibre entre supprimer des applications, libérer des ressources et fournir un système réactif, et conserver autant d'applications d'arrière-plan que possible pour améliorer l'expérience de commutation entre applications.Vous pouvez nous aider en remplaçant le gestionnaire onTrimMemory afin de répondre aux demandes système visant à réduire votre utilisation de la mémoire. Lorsque vous supprimez des processus d'application, le système commence par des processus vides avant de passer aux applications en arrière-plan, à savoir les activités d'hébergement qui ne sont pas visibles et pour lesquelles aucun service n'est en cours d'exécution. Dans les cas extrêmes, les applications avec des activités visibles, voire des services de premier plan, peuvent être terminées pour libérer des ressources pour l'application hébergeant l'activité active. L'ordre dans lequel les applications sont terminées est généralement déterminé par la liste des moins utilisés récemment (LRU), où les applications inutilisées depuis le plus longtemps sont les premières tuées. Cependant, le temps d'exécution prend également en compte la quantité de mémoire potentiellement libérée en supprimant chaque application et est plus susceptible de tuer celles qui offrent des gains plus élevés. Par conséquent, moins vous utilisez de mémoire, moins votre application sera arrêtée et meilleures seront les performances globales du système. Le gestionnaire onTrimMemory est disponible dans chaque composant de l'application, y compris les activités et les services. Il offre aux applications performantes la possibilité de libérer de la mémoire supplémentaire lorsque le système manque de ressources.Vous devez implémenter onTrimMemory pour libérer de la mémoire de manière incrémentielle en fonction des contraintes système actuelles, à l'aide du paramètre level fournissant le contexte à la requête. Notez que les niveaux passés dans onTrimMemory ne représentent pas une simple progression linéaire, mais plutôt une série d'indices contextuels pour vous aider à décider de la meilleure façon de réduire la pression mémoire globale du système:

 

TRIM_MEMORY_RUNNING_MODERATE — Votre application est en cours d'exécution et sa terminaison n'est pas prise en compte, mais le système commence à ressentir une pression de mémoire. 

TRIM_MEMORY_RUNNING_LOW — Votre application est en cours d'exécution et sa terminaison n'est pas prise en compte, mais le système commence à fonctionner de manière significative avec peu de mémoire. Libérer de la mémoire maintenant améliorera les performances du système (et donc de votre application). 

TRIM_MEMORY_RUNNING_CRITICAL: votre application est en cours d'exécution et sa terminaison n'est pas prise en compte, mais le système fonctionne extrêmement peu en mémoire. Le système commencera maintenant à supprimer les processus en arrière-plan si les applications ne libèrent pas de ressources. Par conséquent, en libérant des ressources non critiques, vous pouvez empêcher la dégradation des performances et réduire le risque de fermeture d'autres applications. 

TRIM_MEMORY_UI_HIDDEN : votre application n'affiche plus aucune interface utilisateur visible. C'est une bonne occasion de libérer des ressources volumineuses utilisées uniquement par votre interface utilisateur. C'est une bonne pratique de le faire ici, plutôt que dans votre gestionnaire onStop, car cela évitera de purger / recharger les ressources de l'interface utilisateur si votre interface utilisateur passe rapidement de masqué à visible.  

TRIM_MEMORY_BACKGROUND — Votre application n'est plus visible et a été ajoutée à la liste des moins utilisés récemment (LRU). Elle constitue donc un candidat à faible risque pour la résiliation. Cependant, le système manque de mémoire et peut-être déjà en train de tuer d'autres applications de la liste LRU. Libérez des ressources faciles à récupérer maintenant, afin de réduire la pression du système et de rendre votre application moins susceptible d'être arrêtée. 

TRIM_MEMORY_MODERATE — Votre application se trouve au milieu de la liste des LRU et le système manque de mémoire. Si le système devient de plus en plus limité en mémoire, il y a de fortes chances que votre processus soit mis à mort. 

TRIM_MEMORY_COMPLETE — Votre application est l’un des candidats les plus probables à la résiliation, si ce n’est le cas, si le système ne récupère pas la mémoire immédiatement. Vous devez absolument libérer tout ce qui n’est pas essentiel à la reprise de l’état de votre application. Plutôt que de comparer le niveau actuel à ces valeurs exactes, vous devriez vérifier si la valeur du niveau est supérieure ou égale à un niveau qui vous intéresse, permettant ainsi un futur état intermédiaire.

LISTING 3-5 : Gestionnaires d'événements de requête de découpage de mémoire

@Override

public void onTrimMemory(int level) {   super.onTrimMemory(level);

// L'application est un candidat à la résiliation.

  if (level >= TRIM_MEMORY_COMPLETE) {

// Libère toutes les ressources possibles pour éviter une interruption immédiate.

  } else if (level >= TRIM_MEMORY_MODERATE) {

    // Le fait de libérer des ressources maintenant rendra votre application moins susceptible // d'être fermée.

  } else if (level >= TRIM_MEMORY_BACKGROUND) {     // Libérez des ressources faciles à récupérer maintenant.

  }

// L'application n'est plus visible.

  else if (level >= TRIM_MEMORY_UI_HIDDEN) {  // Votre application n'a plus d'interface utilisateur visible. Libérez toutes les ressources associées à la maintenance de votre interface utilisateur.   

}   

// L'application est en cours d'exécution et n'est pas candidate à la résiliation.

  else if (level >= TRIM_MEMORY_RUNNING_CRITICAL) {

  // Le système va maintenant commencer à tuer les processus en arrière-plan.     // Libérez maintenant des ressources non critiques pour éviter la dégradation des performances // et réduire le risque de fermeture d'autres applications.

  } else if (level >= TRIM_MEMORY_RUNNING_MODERATE) {

    //Libérez des ressources ici pour alléger la pression de la mémoire système et  // améliorer les performances globales du système.

  } else if (level >= TRIM_MEMORY_RUNNING_LOW) {     // Le système commence à ressentir une pression de mémoire.

  }

} 

Remarque

Vous pouvez récupérer le niveau de découpe actuel de votre processus d’application à tout moment à l’aide de la méthode statique getMyMemoryState de ActivityManager, qui renverra le résultat via le paramètre RunningAppProcessInfo transmis. En outre, pour prendre en charge des niveaux d’API inférieurs à 14, vous pouvez utiliser le gestionnaire onLowMemory en tant que solution de repli à peu près équivalente au niveau TRIM_MEMORY_COMPLETE.