Respostas:
getDefaultSharedPreferences
usará um nome padrão como "com.example.something_preferences", mas getSharedPreferences
vai exigir um nome.
getDefaultSharedPreferences
de fato usa Context.getSharedPreferences
(abaixo é diretamente da fonte do 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
não é público, pois o nome é necessário para a estrutura de backup / restauração.
Vamos revisar os pontos básicos da diferença:
getDefaultSharedPreferences()
usa um nome de arquivo de preferência padrão. Esse padrão é definido por aplicativo, para que todas as atividades no mesmo contexto de aplicativo possam acessá-lo facilmente, como no exemplo a seguir:
SharedPreferences spref = PreferenceManager.getDefaultSharedPreferences(this);
if (spref.contains("email")) {
String sEmailAddr = spref.getString("email", "");
}
As preferências são geralmente armazenadas em /data/data/com.package.name/shared_prefs/com.package.name_preferences.xml
.
O método alternativo - getSharedPreferences(name,mode)
requer a indicação de um nome de preferência (arquivo) específico e um modo de operação (por exemplo, privado, legível pelo mundo etc.)
Conforme mencionado por copolii, o resultado é o mesmo, mas a primeira opção é mais simples e não possui flexibilidade para dividir em vários arquivos de preferência, oferecidos pela segunda opção de getSharedPreferences()
. Compartilhar as preferências entre aplicativos usando um indicador de operação MODE_WORLD_READABLE também é algo possível de usar getSharedPreferences()
, mas raramente é usado.
IMHO, getDefaultSharedPreferences()
pode ser usado com segurança sem entrar na confusão de vários nomes de arquivos preferenciais propensos a erros de digitação e confusão, a menos que você queira que módulos diferentes no seu aplicativo usem arquivos de preferências diferentes. Normalmente isso não é necessário. Se um aplicativo precisar salvar muitos parâmetros, provavelmente usar banco de dados externo será melhor, pois oferece também melhor proteção de dados.
Se alguém souber de um bom motivo para usar regularmente getSharedPreferences () e não getDefaultSharedPreferences (), informe-me comentando aqui.
Eu sei que este post é um pouco antigo, mas desde a 24.0.1 da biblioteca de suporte da v7 você pode recuperar as preferências padrão por contexto em qualquer 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)
Há uma terceira função também:
public SharedPreferences Activity.getPreferences(int mode) {}
Veja minha pergunta e resposta aqui: Mexa com as preferências compartilhadas do Android - qual função usar?
GetSharedPreferences () e getDefaultSharedPreferences () são usados para acessar as preferências no nível do aplicativo .getDefaultSharedPreferences () é usado para obter as preferências compartilhadas que funcionam de acordo com a estrutura geral de preferências do Android. É melhor usar getDefaultSharedPreferences (), pois fornece o objeto SharedPreferences que funciona com uma PreferenceActivity por padrão.
Esteja ciente de que usar preferências compartilhadas padrão NÃO é o mesmo que usar preferências compartilhadas com o nome do seu pacote:
context.getSharedPreferences(getPackageName(), MODE_PRIVATE);
=> Nome das preferências compartilhadas: " com.my.packagename "
PreferenceManager.getDefaultSharedPreferences(context);
=> Nome das preferências compartilhadas: " com.my.packagename_preferences "
Context
instância para chamá- las .