SharedPreferences fornece uma maneira fácil de armazenar valores simples persistentes no armazenamento do dispositivo. Nós o usamos frequentemente para armazenar as preferências de alguns usuários ou aplicativos e compartilhá-las entre muitos lugares – como várias atividades.
O que normalmente fazemos é acessar SharedPreferences a partir dos métodos de Activity ou Service. Como aqui:
protected void onCreate(Bundle savedInstanceState) {
SharedPreferences prefs = getSharedPreferences(NAME, Context.MODE_PRIVATE);
prefs.edit().putLong(MY_ID, mId).commit();
// or reading
mId = prefs.getLong(MY_ID, DEFAULT_VALUE);
}
Claro, quando compartilhamos o valor MY ID entre muitos lugares, temos que repetir esse código ao redor. E então, por exemplo, nosso MY ID mudou e não é mais longo – é String. O que nós fazemos? Substituímos todo esse código em todos os lugares que dependem de MY_ID. E é claro que não somos avisados pelo compilador nem pelo IDE caso tenhamos esquecido de alterá-lo em algum lugar.
A solução é mover esse código baseado em SharedPreferences para uma classe separada que pode ser reutilizada em outros lugares. Meu exemplo usa RoboGuice, mas caso você não esteja usando em seu projeto e não queira usá-lo, converter este código é apenas uma questão de passar o Contexto adequado via construtor.
public class MyIdManager {
private final static String MY_ID = "my_id";
@Inject
private SharedPreferences prefs;
public void storeMyId(long myId) {
prefs.edit().putLong(MY_ID, myId).commit();
}
public boolean isMyIdThere() {
return prefs.contains(MY_ID);
}
public long getMyId() {
// do whatever you want here, throw exception
// if there is no data or return default value
}
}
O objeto SharedPreferences é injetado automaticamente pelo RoboGuice para que possamos evitar a escrita de todo aquele código clichê para acessar sua instância.
Agora podemos injetar nosso MyIdManager em nossos objetos (que seja Activity) usando a anotação @Inject simples:
@Inject
private MyIdManager myIdManager;
Isso permite que você faça muitas outras coisas. Visto que suas classes de cliente não dependem explicitamente de SharedPreferences, você pode alterar sua forma de persistência de SharedPreferences para SQLiteDatabase, ContentProvider ou qualquer outro. Você também pode alterar a estrutura dos objetos que está armazenando lá – se estiver interessado em persistir objetos mais complexos, compostos de 5 strings, por exemplo, você pode facilmente passar seu objeto de estrutura para o método store () e fazer toda a lógica nesse método. Por último, mas não menos importante – criar uma classe de stub como essa é muito mais limpo e mais fácil do que fazer stub de SharedPreferences. Você o achará útil quando vier testá-lo.