Diferencia entre getDefaultSharedPreferences y getSharedPreferences
¿ Cuál es la diferencia entre getDefaultSharedPreferences
y getSharedPreferences
en Android? ¿Alguien puede explicarlo?
getDefaultSharedPreferences
utilizará un nombre predeterminado como "com.example.something_preferences", pero getSharedPreferences
requerirá un nombre.
getDefaultSharedPreferences
de hecho usa Context.getSharedPreferences
(a continuación se muestra directamente de la fuente de 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;
}
Repasemos los puntos básicos de diferencia:
getDefaultSharedPreferences()
utiliza un nombre de archivo de preferencias predeterminado. Este valor predeterminado se establece por aplicación, por lo que todas las actividades en el mismo contexto de la aplicación pueden acceder a él fácilmente, como en el siguiente ejemplo:SharedPreferences spref = PreferenceManager.getDefaultSharedPreferences(this); if (spref.contains("email")) { String sEmailAddr = spref.getString("email", ""); }
Las preferencias normalmente se almacenan en
/data/data/com.package.name/shared_prefs/com.package.name_preferences.xml
.El método alternativo
getSharedPreferences(name,mode)
requiere indicar un nombre de preferencia (archivo) específico y un modo de operación (por ejemplo, privado, legible mundialmente, etc.)
Como mencionó copolii, el resultado es el mismo, pero la primera opción es más simple y carece de la flexibilidad para dividir en múltiples archivos de preferencias, que ofrece la segunda opción getSharedPreferences()
. Compartir las preferencias entre aplicaciones usando un indicador de operación MODE_WORLD_READABLE también es algo posible usando getSharedPreferences()
, pero rara vez se usa.
En mi humilde opinión, getDefaultSharedPreferences()
se puede usar de forma segura sin entrar en la confusión de múltiples nombres de archivos de preferencias que son propensos a errores tipográficos y confusión, a menos que desee que diferentes módulos en su aplicación usen diferentes archivos de preferencias. Normalmente esto no es necesario. Si una aplicación necesita guardar muchos parámetros, probablemente será mejor usar una base de datos externa, ya que también ofrece una mejor protección de datos.
Si alguien conoce una buena razón para usar getSharedPreferences() con regularidad y no getDefaultSharedPreferences(), hágamelo saber comentando aquí.