web-dev-qa-db-fra.com

Différence entre getDefaultSharedPreferences et getSharedPreferences

Quelle est la différence entre getDefaultSharedPreferences et getSharedPreferences dans Android? Quelqu'un peut-il s'il vous plaît expliquer?

216
James

getDefaultSharedPreferences utilisera un nom par défaut tel que "com.example.something_preferences", mais getSharedPreferences sera requis un nom.

getDefaultSharedPreferences utilise 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;
}
222
copolii

Passons en revue les points de différence fondamentaux:

  1. getDefaultSharedPreferences() utilise un nom de fichier de préférences par défaut. Cette valeur par défaut est définie par application. Ainsi, toutes les activités du 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 dans /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 (fichier) spécifique et un mode de fonctionnement (par exemple, privé, lisible par le monde, etc.).

Comme mentionné par copolii, le résultat est le même, mais la première option est plus simple et manque de souplesse pour 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 avec getSharedPreferences(), mais il est rarement utilisé.

IMHO, 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, à moins que vous ne souhaitiez que différents modules de votre application utilisent des fichiers de préférences différents. Normalement, ce 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 préférable 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.

118
wiztrail

Je sais que cette publication est un peu ancienne, mais depuis la version 24.0.1 de la bibliothèque de support de la v7, vous pouvez récupérer les préférences par défaut en fonction du contexte, n'importe où, à l'aide de

// 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

2
Makibo

Il y a aussi une 3ème fonction:

public SharedPreferences Activity.getPreferences(int mode) {}

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

1
Hack06

GetSharedPreferences () et getDefaultSharedPreferences () sont utilisées 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 global d'Android. getDefaultSharedPreferences () est préférable car il donne l'objet SharedPreferences qui fonctionne avec un PreferenceActivity par défaut.

1
Android Developer

Sachez que l'utilisation des préférences partagées par défaut est NOT identique à 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"

0
Richard R