web-dev-qa-db-fra.com

Contexte d'application SharedPreferences vs contexte d'activité

J'utilise plusieurs SharedPreferences pour stocker des données dans mon application. Certaines préférences sont utilisées dans de nombreuses activités.

Je sais que les SharedPreferences sont soutenues en interne par une carte pour un accès en lecture rapide et écrites sur sdcard lorsque les paramètres sont modifiés.

Je me demande quelle voie est meilleure si une préférence partagée est accessible par un grand nombre d'activités:

  1. Instanciez-le dans chaque activité en utilisant le contexte de l'activité.
  2. Instanciez-le dans chaque activité, mais en utilisant le contexte de l'application.
  3. Mettez-le par exemple la classe Application et l'instancier une seule fois là-bas, semblable à un singleton.

Si j'utilise 1. la solution, y a-t-il un objet de préférence partagée pour chaque activité? Et la carte interne de la préférence partagée sera-t-elle détruite lorsque l'activité sera détruite?

Si j'utilise 2. la solution, y aura-t-il une seule instance bien que j'appelle getSharedPreferences dans chaque activité? Et la carte interne sera-t-elle en mémoire tant que l'application sera en vie?

J'espère que quelqu'un sait comment Android le gère en interne.

48
d1rk

Il vaut la peine de revoir les sources qui montrent qu'une instance Context (que ce soit une instance Activity ou Application) partage la même carte statique HashMap<String, SharedPreferencesImpl>.

Ainsi, chaque fois que vous demandez une instance de SharedPreferences du même nom via Context.getSharedPreferences(name, mode) vous obtenez la même instance car elle vérifie d'abord si la carte contient déjà une instance de SharedPreferences pour une clé ( qui est le nom passé). Une fois que l'instance de SharedPreferences est chargée, elle ne sera plus chargée, mais extraite de la carte à la place.

Donc, peu importe votre chemin, l'important est d'utiliser le même nom afin d'obtenir les mêmes préférences dans différentes parties de l'application. Cependant, la création d'un "point d'accès" unique pour les prefs pourrait être un plus. Il pourrait donc s'agir d'un wrapper singleton sur les préférences instanciées dans Application.onCreate().

70
Vit Khudenko

SharedPreferences sont gérés en interne par Android en singletons. Vous pouvez obtenir autant d'instances que vous le souhaitez en utilisant:

context.getSharedPreferences(name, mode);

tant que vous utilisez le même nom, vous obtiendrez toujours le même instance. Par conséquent, il n'y a aucun problème de concurrence.

18
David Wasser

Je préférerai utiliser une classe singleton pour préférence, initialiser une fois la préférence par contexte d'application . créer des méthodes getter et setter (get/put) pour ajouter, mettre à jour et supprimer des données.

De cette façon, il créera une instance une fois et pourra être plus lisible et réutilisable.

9
AAnkit