Respuestas:
getDefaultSharedPreferences
utilizará un nombre por defecto como "com.example.something_preferences", pero getSharedPreferences
se requerirá un nombre.
getDefaultSharedPreferences
de hecho utiliza Context.getSharedPreferences
(a continuación es 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;
}
getDefaultSharedPreferencesName
no es público ya que se necesita el nombre para el marco de copia de seguridad / restauración.
Repasemos los puntos básicos de diferencia:
getDefaultSharedPreferences()
usa un nombre de archivo de preferencia predeterminado. Este valor predeterminado se establece por aplicación, por lo que todas las actividades en el mismo contexto de 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 generalmente 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 por el mundo, etc.)
Como mencionó copolii, el resultado es el mismo, pero la primera opción es más simple y carece de la flexibilidad para dividirse en archivos de preferencias múltiples, que ofrece la segunda opción de getSharedPreferences()
. Compartir las preferencias entre aplicaciones usando un indicador de operación MODE_WORLD_READABLE también es algo posible de usar getSharedPreferences()
, pero rara vez se usa.
EN MI HUMILDE OPINIÓN, getDefaultSharedPreferences()
puede usar de forma segura sin entrar en la confusión de los nombres de múltiples 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 sea 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 regularmente getSharedPreferences () y no getDefaultSharedPreferences (), hágamelo saber al comentar aquí.
Sé que esta publicación es un poco antigua, pero desde 24.0.1 de la biblioteca de soporte de v7 puede recuperar las preferencias predeterminadas por contexto en cualquier lugar usando
// context might be an application context, activity, ..
// so if you want to get your apps defaults, pass an activity context
PreferenceManager.getDefaultSharedPreferences(context)
También hay una tercera función:
public SharedPreferences Activity.getPreferences(int mode) {}
Vea mi pregunta y respuesta aquí: Desordenar con las preferencias compartidas de Android, ¿qué función usar?
GetSharedPreferences () y getDefaultSharedPreferences () se usan para acceder a las preferencias a nivel de aplicación .getDefaultSharedPreferences () se usa para obtener las preferencias compartidas que funcionan de acuerdo con el marco de preferencias general de Android. getDefaultSharedPreferences () es mejor para usar, ya que proporciona el objeto SharedPreferences que funciona con una PreferenceActivity de forma predeterminada.
Tenga en cuenta que usar las preferencias compartidas predeterminadas NO es lo mismo que usar las preferencias compartidas con el nombre de su paquete:
context.getSharedPreferences(getPackageName(), MODE_PRIVATE);
=> Nombre de las preferencias compartidas: " com.my.packagename "
PreferenceManager.getDefaultSharedPreferences(context);
=> Nombre de las preferencias compartidas: " com.my.packagename_preferences "
Context
instancia para llamar a cualquiera de ellos.