Diferença entre getDefaultSharedPreferences e getSharedPreferences

224

Qual é a diferença entre getDefaultSharedPreferencese getSharedPreferencesno Android? Alguém pode explicar?

James
fonte
Uma diferença quase óbvia demais é que um é estático e outro não. Mas isso realmente não importa, pois você precisa de uma Contextinstância para chamá- las .
precisa saber é

Respostas:

224

getDefaultSharedPreferencesusará um nome padrão como "com.example.something_preferences", mas getSharedPreferencesvai exigir um nome.

getDefaultSharedPreferencesde 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;
}
copolii
fonte
9
Mau getDefaultSharedPreferencesNamenão é público, pois o nome é necessário para a estrutura de backup / restauração.
Martin
E como ouvir a mudança de preferência, no modo getSharedPreferences que usa nome personalizado para preferência? (não utilizar o nome padrão como getSharedPreferences "com.example.something_preferences")
Dr.jacky
Você poderia adicionar um link à fonte?
Mr_and_Mrs_D
@Mr_and_Mrs_D é mais fácil procurar. Se eu adicionar um link, seria para uma versão específica da API, que pode ou não ser o que você está procurando.
Copolii
120

Vamos revisar os pontos básicos da diferença:

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

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

wiztrail
fonte
7
Minha razão é: stackoverflow.com/questions/10786172/…
Kostadin
1
E como ouvir a mudança de preferência, no modo getSharedPreferences que usa nome personalizado para preferência? (não utilizar o nome padrão como getSharedPreferences "com.example.something_preferences")
Dr.jacky
Dr.jacky Eu diria que você agruparia suas preferências em algum tipo de objeto parecido com Session: class Session {prefs = getSharedPreferences () ...} e usaria getters e setters para o que você deseja monitorar. Quando os setters são chamados, você pode acionar eventos na lógica do setter.
precisa
2

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)

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

Makibo
fonte
O PreferenceManager está sendo descontinuado no Android Q. Você ainda pode usar a maneira context.getSharedPreferences. Mudou esta chamada para context.getSharedPreferences ( "$ {packageName} _preferences", MODE_PRIVATE)
Kevin
2
Parece que o PreferenceManager está sendo preterido, pois está sendo movido para o Androix. developer.android.com/reference/androidx/preference/…
FutureShocked
1

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?

Hack06
fonte
Este é um invólucro para getSharedPreferences () do código-fonte da Atividade: public SharedPreferences getPreferences (modo int) {return getSharedPreferences (getLocalClassName (), mode); }
tarn
1

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.

Desenvolvedor Android
fonte
0

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 "

Richard R
fonte