Différence entre getDefaultSharedPreferences et getSharedPreferences


224

Quelle est la différence entre getDefaultSharedPreferenceset getSharedPreferencesdans Android? Quelqu'un peut-il expliquer?


Une différence presque trop évidente est que l'un est statique et l'autre non. Mais cela n'a pas vraiment d'importance, car vous avez besoin d'une Contextinstance pour appeler l'une ou l'autre.
LarsH

Réponses:


224

getDefaultSharedPreferencesutilisera un nom par défaut comme « com.example.something_preferences », mais getSharedPreferencesva exiger un nom.

getDefaultSharedPreferencesutilise en fait Context.getSharedPreferences(ci-dessous est directement à partir de la source Android):

public static SharedPreferences getDefaultSharedPreferences(Context context) {
    return context.getSharedPreferences(getDefaultSharedPreferencesName(context),
        getDefaultSharedPreferencesMode());
}

private static String getDefaultSharedPreferencesName(Context context) {
    return context.getPackageName() + "_preferences";
}

private static int getDefaultSharedPreferencesMode() {
    return Context.MODE_PRIVATE;
}

9
Dommage getDefaultSharedPreferencesNamen'est pas public car le nom est nécessaire pour le framework de sauvegarde / restauration.
Martin


Et comment écouter le changement de préférence, en mode getSharedPreferences qui utilise un nom personnalisé pour la préférence? (ne pas utiliser le nom par défaut comme getSharedPreferences "com.example.something_preferences")
Dr.jacky

Pourriez-vous s'il vous plaît ajouter un lien vers la source?
Mr_and_Mrs_D

@Mr_and_Mrs_D, il est plus facile de le rechercher. Si j'ajoute un lien, ce serait vers une version d'API spécifique, qui peut ou non être ce que vous recherchez.
copolii

120

Passons en revue les principaux points de différence:

  1. getDefaultSharedPreferences()utilise un nom de fichier de préférences par défaut. Cette valeur par défaut est définie par application, donc toutes les activités dans le même contexte d'application peuvent y accéder facilement comme dans l'exemple suivant:

    SharedPreferences spref = PreferenceManager.getDefaultSharedPreferences(this);
    if (spref.contains("email")) {
         String sEmailAddr = spref.getString("email", "");
    }

    Les préférences sont généralement stockées sur /data/data/com.package.name/shared_prefs/com.package.name_preferences.xml.

  2. La méthode alternative - getSharedPreferences(name,mode)nécessite d'indiquer un nom de préférence spécifique (fichier) et un mode de fonctionnement (par exemple privé, world_readable, etc.)

Comme mentionné par copolii, le résultat est le même, mais la première option est plus simple et manque de flexibilité pour se diviser en plusieurs fichiers de préférences, ce qui est offert par la deuxième option de getSharedPreferences(). Le partage des préférences entre les applications à l'aide d'un indicateur de fonctionnement MODE_WORLD_READABLE est également possible getSharedPreferences(), mais rarement utilisé.

A MON HUMBLE AVIS, getDefaultSharedPreferences() peut être utilisé en toute sécurité sans entrer dans la confusion de plusieurs noms de fichiers de préférences sujets aux fautes de frappe et à la confusion, sauf si vous souhaitez que différents modules de votre application utilisent des fichiers de préférences différents. Normalement, cela n'est pas nécessaire. Si une application doit enregistrer de nombreux paramètres, l'utilisation d'une base de données externe sera probablement meilleure car elle offre également une meilleure protection des données.

Si quelqu'un connaît une bonne raison d'utiliser régulièrement getSharedPreferences () et non getDefaultSharedPreferences (), veuillez me le faire savoir en commentant ici.



1
Et comment écouter le changement de préférence, en mode getSharedPreferences qui utilise un nom personnalisé pour la préférence? (ne pas utiliser le nom par défaut comme getSharedPreferences "com.example.something_preferences")
Dr.jacky

Dr.jacky, je dirais que vous concluriez vos préférences dans une sorte d'objet semblable à une session: classe Session {prefs = getSharedPreferences () ...}, puis utiliseriez des getters et des setters pour les choses que vous souhaitez surveiller. Lorsque les setters sont appelés, vous pouvez déclencher des événements dans la logique du setter.
Alex Weavers

2

Je sais que ce post est un peu ancien, mais depuis la version 24.0.1 de la bibliothèque de support v7, vous pouvez récupérer les préférences par défaut n'importe où en utilisant

// context might be an application context, activity, ..
// so if you want to get your apps defaults, pass an activity context
PreferenceManager.getDefaultSharedPreferences(context)

Voir https://developer.android.com/reference/android/support/v7/preference/PreferenceManager#getdefaultsharedpreferences


PreferenceManager est déprécié dans Android Q. Cependant, vous pouvez toujours utiliser la méthode context.getSharedPreferences. Modification de cet appel en context.getSharedPreferences ("$ {packageName} _preferences", MODE_PRIVATE)
Kevin

2
Il semble que PreferenceManager soit obsolète en ce qu'il vient d'être déplacé vers Androix. developer.android.com/reference/androidx/preference/…
FutureShocked


1

GetSharedPreferences () et getDefaultSharedPreferences () sont utilisés pour accéder aux préférences au niveau de l'application .getDefaultSharedPreferences () est utilisé pour obtenir les préférences partagées qui fonctionnent conformément au cadre de préférences général d'Android. Il est préférable d'utiliser getDefaultSharedPreferences () car il donne par défaut l'objet SharedPreferences qui fonctionne avec une PreferenceActivity.


0

N'oubliez pas que l'utilisation des préférences partagées par défaut n'est PAS la même chose que l'utilisation des préférences partagées avec le nom de votre package:

context.getSharedPreferences(getPackageName(), MODE_PRIVATE);

=> Nom des préférences partagées: " com.my.packagename "

PreferenceManager.getDefaultSharedPreferences(context);

=> Nom des préférences partagées: " com.my.packagename_preferences "

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.