Differenza tra getDefaultSharedPreferences e getSharedPreferences


224

Qual è la differenza tra getDefaultSharedPreferencese getSharedPreferencesin Android? Qualcuno può spiegare?


Una differenza quasi troppo ovvia è che uno è statico e uno no. Ma non importa, dal momento che hai bisogno di Contextun'istanza per chiamare l'una o l'altra.
LarsH,

Risposte:


224

getDefaultSharedPreferencesutilizzerà un nome di default come "com.example.something_preferences", ma getSharedPreferencesavrà bisogno di un nome.

getDefaultSharedPreferencesinfatti 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;
}

9
Peccato getDefaultSharedPreferencesNamenon è pubblico in quanto il nome è necessario per il framework di backup / ripristino.
Martin


E come ascoltare la modifica delle preferenze, in modalità getSharedPreferences che utilizza un nome personalizzato per la preferenza? (non utilizzare il nome predefinito come getSharedPreferences "com.example.something_preferences")
Dr.jacky,

Potresti per favore aggiungere un link alla fonte?
Mr_and_Mrs_D

@Mr_and_Mrs_D è più facile cercarlo. Se aggiungo un collegamento sarebbe a una versione specifica dell'API, che potrebbe essere o meno ciò che stai cercando.
copolii

120

Rivediamo i punti di base della differenza:

  1. 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.

  2. 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.



1
E come ascoltare la modifica delle preferenze, in modalità getSharedPreferences che utilizza un nome personalizzato per la preferenza? (non utilizzare il nome predefinito come getSharedPreferences "com.example.something_preferences")
Dr.jacky,

Dr.jacky Direi che potresti racchiudere le tue preferenze in una sorta di oggetto simile a una Sessione: class Session {prefs = getSharedPreferences () ...} e quindi usare getter e setter per le cose che vuoi monitorare. Quando vengono chiamati i setter, è possibile attivare eventi nella logica dei setter.
Alex Weavers,

2

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)

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


PreferenceManager è deprecato in Android Q. Tuttavia, puoi comunque utilizzare il metodo context.getSharedPreferences. Modificata questa chiamata in context.getSharedPreferences ("$ {nomepacchetto} _preferences", MODE_PRIVATE)
Kevin,

2
Sembra che PreferenceManager sia deprecato in quanto viene appena spostato su Androix. developer.android.com/reference/androidx/preference/…
FutureShocked


1

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.


0

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 "

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.