2011-05-10 9 views

Respuesta

193

getDefaultSharedPreferences utilizará un nombre por defecto como "com.example.something_preferences", pero se getSharedPreferences requerir un nombre.

getDefaultSharedPreferences de hecho utiliza Context.getSharedPreferences (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; 
} 
+6

Para mal 'getDefaultSharedPreferencesName' no es público ya que el nombre es necesario para la estructura de copia de seguridad/restauración. – Martin

+0

¿Qué pasa con http: // stackoverflow.com/questions/10786172/android-getdefaultsharedpreferences? –

+0

¿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") –

105

Repasemos los puntos básicos de diferencia:

  1. getDefaultSharedPreferences() utiliza un nombre de preferencia-archivo predeterminado. Este defecto se fija por aplicación, por lo que todas las actividades en el mismo contexto de aplicación puede 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 se almacenan generalmente en /data/data/com.package.name/shared_prefs/com.package.name_preferences.xml.

  2. El método alternativo - getSharedPreferences(name,mode) requiere para indicar una preferencia nombre específico (archivo) y un modo de funcionamiento (por ejemplo, privada, world_readable, etc.)

Como se ha mencionado por copolii, el resultado es el mismo , pero la primera opción es más simple y carece de la flexibilidad para dividirse en varios archivos de preferencias, 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 usando getSharedPreferences(), pero rara vez se usa.

En mi humilde opinión, getDefaultSharedPreferences() se pueden usar de forma segura sin confundir los nombres de archivos de preferencias múltiples que son propensos a errores ortográficos y confusos, a menos que desee que diferentes módulos en su aplicación utilicen 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 sabe de una buena razón para usar regularmente getSharedPreferences() y no getDefaultSharedPreferences(), hágamelo saber comentando aquí.

+6

Mi razón es: http://stackoverflow.com/questions/10786172/android-getdefaultsharedpreferences – Kostadin

+1

¿Y cómo escuchar el cambio de preferencia, en el modo getSharedPreferences que usa un nombre personalizado para las preferencias? (No utilice el nombre por defecto como "com.example.something_preferences" getSharedPreferences) –

1

Hay una tercera función, así:

public SharedPreferences Activity.getPreferences(int mode) {} 

Ver mi pregunta y la respuesta aquí: Mess with the shared preferences of android - which function to use?

+0

Este es un contenedor de getSharedPreferences() a partir del código fuente de la actividad: SharedPreferences getPreferences públicas (int modo) { getSharedPreferences retorno (getLocalClassName(), modo); } – tarn

0

Ambos getSharedPreferences() y getDefaultSharedPreferences() se utilizan para acceder a las preferencias de 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 usar ya que le da al objeto SharedPreferences que funciona con una actividad de preferencia de forma predeterminada.