Diferencia entre getDefaultSharedPreferences y getSharedPreferences

224

¿Cuál es la diferencia entre getDefaultSharedPreferencesy getSharedPreferencesen Android? ¿Alguien puede explicar?

James
fuente
Una diferencia casi demasiado obvia es que uno es estático y el otro no. Pero en realidad no importa, ya que necesita una Contextinstancia para llamar a cualquiera de ellos.
LarsH

Respuestas:

224

getDefaultSharedPreferencesutilizará un nombre por defecto como "com.example.something_preferences", pero getSharedPreferencesse requerirá un nombre.

getDefaultSharedPreferencesde 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;
}
copolii
fuente
99
Lo malo getDefaultSharedPreferencesNameno es público ya que se necesita el nombre para el marco de copia de seguridad / restauración.
Martin
¿Qué pasa con stackoverflow.com/questions/10786172/… ?
Dr.jacky
¿Y cómo escuchar el cambio de preferencia, en el modo getSharedPreferences que usa un nombre personalizado para preferencia? (no use el nombre predeterminado como getSharedPreferences "com.example.something_preferences")
Dr.jacky
¿Podría agregar un enlace a la fuente?
Mr_and_Mrs_D
@Mr_and_Mrs_D es más fácil buscarlo. Si agrego un enlace, sería a una versión de API específica, que puede o no ser lo que estás buscando.
copolii
120

Repasemos los puntos básicos de diferencia:

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

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

wiztrail
fuente
77
Mi razón es: stackoverflow.com/questions/10786172/…
Kostadin
1
¿Y cómo escuchar el cambio de preferencia, en el modo getSharedPreferences que usa un nombre personalizado para preferencia? (no use el nombre predeterminado como getSharedPreferences "com.example.something_preferences")
Dr.jacky
Dr.jacky, diría que resumiría sus preferencias en algún tipo de objeto tipo Sesión: clase Sesión {prefs = getSharedPreferences () ...} y luego usaría getters y setters para las cosas que desea monitorear. Cuando se llama a los establecedores, puede desencadenar eventos en la lógica del establecedor.
Alex Weavers
2

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)

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

Makibo
fuente
PreferenceManager está en desuso en Android Q. Sin embargo, aún puede usar la forma de cosas context.getSharedPreferences. Cambió esta llamada a context.getSharedPreferences ("$ {packageName} _preferences", MODE_PRIVATE)
Kevin
2
Parece que PreferenceManager está en desuso porque simplemente se está moviendo a Androix. developer.android.com/reference/androidx/preference/…
FutureShocked
1

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?

Hack06
fuente
Este es un contenedor para getSharedPreferences () del código fuente de la actividad: public SharedPreferences getPreferences (int mode) {return getSharedPreferences (getLocalClassName (), mode); }
tarn
1

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.

Desarrollador de Android
fuente
0

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 "

Richard R
fuente