Risposte:
getDefaultSharedPreferences
utilizzerà un nome di default come "com.example.something_preferences", ma getSharedPreferences
avrà bisogno di un nome.
getDefaultSharedPreferences
infatti utilizza Context.getSharedPreferences
(di seguito è direttamente dalla fonte 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;
}
getDefaultSharedPreferencesName
non è pubblico in quanto il nome è necessario per il framework di backup / ripristino.
Rivediamo i punti di base della differenza:
getDefaultSharedPreferences()
utilizza un nome file delle preferenze predefinito. Questa impostazione predefinita è impostata per applicazione, quindi tutte le attività nello stesso contesto di app possono accedervi facilmente come nell'esempio seguente:
SharedPreferences spref = PreferenceManager.getDefaultSharedPreferences(this);
if (spref.contains("email")) {
String sEmailAddr = spref.getString("email", "");
}
Le preferenze sono generalmente archiviate in /data/data/com.package.name/shared_prefs/com.package.name_preferences.xml
.
Il metodo alternativo - getSharedPreferences(name,mode)
richiede di indicare un nome di preferenza (file) specifico e una modalità operativa (ad es. Privata, leggibile dal mondo, ecc.)
Come menzionato da copolii, il risultato è lo stesso, ma la prima opzione è più semplice e non ha la flessibilità di dividere in più file di preferenze, che è offerto dalla seconda opzione di getSharedPreferences()
. Anche condividere le preferenze tra le app usando un indicatore di funzionamento MODE_WORLD_READABLE è qualcosa che è possibile utilizzare getSharedPreferences()
, ma viene usato raramente.
IMHO, getDefaultSharedPreferences()
può essere utilizzato in sicurezza senza andare nella confusione di più nomi di file di preferenze che sono inclini a errori di battitura e confusione, a meno che tu non voglia che moduli diversi nella tua app utilizzino file di preferenze diversi. Normalmente questo non è necessario. Se un'app deve salvare molti parametri, probabilmente l'utilizzo di un database esterno sarà migliore in quanto offre anche una migliore protezione dei dati.
Se qualcuno conosce una buona ragione per usare regolarmente getSharedPreferences () e non getDefaultSharedPreferences (), per favore fatemi sapere commentando qui.
So che questo post è un po 'vecchio, ma dal 24.0.1 della libreria di supporto v7 è possibile recuperare le preferenze predefinite per contesto ovunque usando
// context might be an application context, activity, ..
// so if you want to get your apps defaults, pass an activity context
PreferenceManager.getDefaultSharedPreferences(context)
C'è anche una terza funzione:
public SharedPreferences Activity.getPreferences(int mode) {}
Vedi la mia domanda e risposta qui: pasticciare con le preferenze condivise di Android - quale funzione usare?
Sia getSharedPreferences () che getDefaultSharedPreferences () vengono utilizzati per accedere alle preferenze a livello di applicazione .getDefaultSharedPreferences () viene utilizzato per ottenere le preferenze condivise che funzionano in conformità con il framework delle preferenze generali di Android. getDefaultSharedPreferences () è meglio usare in quanto fornisce l'oggetto SharedPreferences che funziona con PreferenceActivity per impostazione predefinita.
Tenere presente che l'utilizzo delle preferenze condivise predefinite NON equivale all'utilizzo delle preferenze condivise con il nome del pacchetto:
context.getSharedPreferences(getPackageName(), MODE_PRIVATE);
=> Nome delle preferenze condivise: " com.my.packagename "
PreferenceManager.getDefaultSharedPreferences(context);
=> Nome delle preferenze condivise: " com.my.packagename_preferences "
Context
un'istanza per chiamare l'una o l'altra.