Antworten:
getDefaultSharedPreferences
wird ein Standardname wie „com.example.something_preferences“ verwenden , aber getSharedPreferences
wird erfordern einen Namen.
getDefaultSharedPreferences
in 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;
}
getDefaultSharedPreferencesName
ist nicht öffentlich, da der Name für das Backup / Restore-Framework benötigt wird.
Lassen Sie uns die grundlegenden Unterschiede überprüfen:
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
.
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.
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)
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?
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.
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 "
Context
Instanz benötigen, um eine der beiden aufzurufen.