Différence entre getDefaultSharedPreferences et getSharedPreferences

224

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

James
la source
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;
}
copolii
la source
9
Dommage getDefaultSharedPreferencesNamen'est pas public car le nom est nécessaire pour le framework de sauvegarde / restauration.
Martin
Qu'en est-il de stackoverflow.com/questions/10786172/… ?
Dr.jacky
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.

wiztrail
la source
7
Ma raison est: stackoverflow.com/questions/10786172/…
Kostadin
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

Makibo
la source
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

Il y a aussi une 3ème fonction:

public SharedPreferences Activity.getPreferences(int mode) {}

Voir ma question et réponse ici: Mess avec les préférences partagées d'Android - quelle fonction utiliser?

Hack06
la source
Il s'agit d'un wrapper pour getSharedPreferences () à partir du code source de l'activité: public SharedPreferences getPreferences (int mode) {return getSharedPreferences (getLocalClassName (), mode); }
tarn
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.

Développeur Android
la source
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 "

Richard R
la source