Unterschied zwischen getDefaultSharedPreferences und getSharedPreferences

224

Was ist der Unterschied zwischen getDefaultSharedPreferencesund getSharedPreferencesin Android? Kann jemand bitte erklären?

James
quelle
Ein fast zu offensichtlicher Unterschied ist, dass man statisch ist und man nicht. Aber es spielt keine Rolle, da Sie eine ContextInstanz benötigen, um eine der beiden aufzurufen.
LarsH

Antworten:

224

getDefaultSharedPreferenceswird ein Standardname wie „com.example.something_preferences“ verwenden , aber getSharedPreferenceswird erfordern einen Namen.

getDefaultSharedPreferencesin der Tat verwendet Context.getSharedPreferences(unten ist direkt aus der Android-Quelle):

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
quelle
9
Schade getDefaultSharedPreferencesNameist nicht öffentlich, da der Name für das Backup / Restore-Framework benötigt wird.
Martin
Und wie kann man die Änderung der Einstellungen im getSharedPreferences-Modus abhören, bei dem ein benutzerdefinierter Name als Voreinstellung verwendet wird? (Verwenden Sie keinen Standardnamen wie getSharedPreferences "com.example.something_preferences")
Dr.jacky
Könnten Sie bitte einen Link zur Quelle hinzufügen?
Mr_and_Mrs_D
@Mr_and_Mrs_D es ist einfacher, es nachzuschlagen. Wenn ich einen Link hinzufüge, handelt es sich um eine bestimmte API-Version, nach der Sie möglicherweise suchen oder nicht.
Copolii
120

Lassen Sie uns die grundlegenden Unterschiede überprüfen:

  1. getDefaultSharedPreferences()verwendet einen Standardnamen für die Einstellungsdatei. Diese Standardeinstellung wird pro Anwendung festgelegt, sodass alle Aktivitäten im selben App-Kontext wie im folgenden Beispiel problemlos darauf zugreifen können:

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

    Die Einstellungen werden normalerweise unter gespeichert /data/data/com.package.name/shared_prefs/com.package.name_preferences.xml.

  2. Die alternative Methode - getSharedPreferences(name,mode)erfordert die Angabe eines bestimmten Präferenznamens (Datei) und eines Betriebsmodus (z. B. privat, world_readable usw.)

Wie von copolii erwähnt, ist das Ergebnis das gleiche, aber die erste Option ist einfacher und es fehlt die Flexibilität, auf mehrere Voreinstellungsdateien aufzuteilen, die durch die zweite Option von angeboten wird getSharedPreferences(). Das Teilen der Einstellungen zwischen Apps mithilfe eines MODE_WORLD_READABLE-Betriebsindikators ist ebenfalls möglich getSharedPreferences(), wird jedoch nur selten verwendet.

IMHO getDefaultSharedPreferences()kann sicher verwendet werden, ohne dass mehrere Präferenzdateinamen verwechselt werden, die zu Tippfehlern und Verwirrung neigen, es sei denn, Sie möchten, dass verschiedene Module in Ihrer App unterschiedliche Präferenzdateien verwenden. Normalerweise wird dies nicht benötigt. Wenn eine App viele Parameter speichern muss, ist die Verwendung einer externen Datenbank wahrscheinlich besser, da sie auch einen besseren Datenschutz bietet.

Wenn jemand einen guten Grund kennt, getSharedPreferences () und nicht getDefaultSharedPreferences () regelmäßig zu verwenden, lassen Sie es mich bitte wissen, indem Sie hier einen Kommentar abgeben.

Wiztrail
quelle
7
Mein Grund ist: stackoverflow.com/questions/10786172/…
Kostadin
1
Und wie kann man die Änderung der Einstellungen im getSharedPreferences-Modus abhören, bei dem ein benutzerdefinierter Name als Voreinstellung verwendet wird? (Verwenden Sie keinen Standardnamen wie getSharedPreferences "com.example.something_preferences")
Dr.jacky
Dr.jacky Ich würde sagen, Sie würden Ihre Einstellungen in ein sitzungsähnliches Objekt einschließen: class Session {prefs = getSharedPreferences () ...} und dann Getter und Setter für die Dinge verwenden, die Sie überwachen möchten. Wenn die Setter aufgerufen werden, können Sie Ereignisse in der Setterlogik auslösen.
Alex Weavers
2

Ich weiß, dass dieser Beitrag etwas alt ist, aber seit 24.0.1 der v7-Unterstützungsbibliothek können Sie die Standardeinstellungen nach Kontext überall mit abrufen

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

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

Makibo
quelle
PreferenceManager wird in Android Q nicht mehr unterstützt. Sie können jedoch weiterhin die Methode context.getSharedPreferences verwenden. Dieser Aufruf wurde in context.getSharedPreferences ("$ {packageName} _preferences", MODE_PRIVATE) geändert
Kevin
2
Es sieht so aus, als ob PreferenceManager veraltet ist, da es nur nach Androix verschoben wird. developer.android.com/reference/androidx/preference/…
FutureShocked
1

Es gibt auch eine dritte Funktion:

public SharedPreferences Activity.getPreferences(int mode) {}

Siehe meine Frage und Antwort hier: Verwirren Sie sich mit den gemeinsamen Einstellungen von Android - welche Funktion soll verwendet werden?

Hack06
quelle
Dies ist ein Wrapper für getSharedPreferences () aus dem Aktivitätsquellcode: public SharedPreferences getPreferences (int mode) {return getSharedPreferences (getLocalClassName (), mode); }
Tarn
1

Sowohl getSharedPreferences () als auch getDefaultSharedPreferences () werden verwendet, um auf Einstellungen auf Anwendungsebene zuzugreifen. Mit getDefaultSharedPreferences () werden die freigegebenen Einstellungen abgerufen, die gemäß dem allgemeinen Einstellungsframework von Android funktionieren. getDefaultSharedPreferences () ist besser zu verwenden, da es das SharedPreferences-Objekt angibt, das standardmäßig mit einer PreferenceActivity arbeitet.

Android-Entwickler
quelle
0

Beachten Sie, dass die Verwendung gemeinsamer Standardeinstellungen NICHT mit der Verwendung gemeinsamer Einstellungen mit Ihrem Paketnamen identisch ist:

context.getSharedPreferences(getPackageName(), MODE_PRIVATE);

=> Name der freigegebenen Einstellungen : " com.my.packagename "

PreferenceManager.getDefaultSharedPreferences(context);

=> Name der freigegebenen Einstellungen : " com.my.packagename_preferences "

Richard R.
quelle