La classe SharedPreferences fornisce un framework che ci permette di memorizzare una map di coppie chiave-valore. In particolare la chiave della coppia è sempre una String mentre il valore può essere un tipo primitivo boolean, int, float, long o un oggetto di tipo String. I valori sono memorizzati fisicamente in un file xml e sono disponibili anche dopo un riavvio dell’applicazione o del telefono.
All’interno di una Activity un oggetto SharedPreferences può essere creato richiamando semplicemente il metodo getPreferences, il parametro passato indica se il corrispondente file xml deve essere privato o leggibile anche dalle altre applicazioni installate sul device.
1
| SharedPreferences prefs = getPreferences(MODE_PRIVATE); |
Usando il metodo getPreferences di Activity i valori memorizzati sono privati e disponibili solo dall’Activity. Se vogliamo creare un oggetto SharedPreferences utilizzabile in più Activity all’interno dell’applicazione possiamo usare il metodo statico getDefaultSharedPreferences della classe PreferenceManager:
1
| SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); |
Lettura di un valore
Per ricavare il valore associato a una chiave deve essere usato un metodo diverso in base al tipo del valore, esistono i metodi getBoolean, getInt, getFloat, getLong e getString che hanno come parametri una stringa contenente la chiave e il valore di default da ritornare nel caso in cui la chiave non sia presente. Esiste anche un metodo getAll che ritorna una Map con tutte le coppie presenti.
Per esempio per leggere un boolean associato a una chiave potremmo usare il metodo getBoolean in questo modo:
1
2
| SharedPreferences prefs = getPreferences(MODE_PRIVATE);
boolean primoAvvio = prefs.getBoolean(PRIMO_AVVIO, true); |
Memorizzazione di un valore
Per memorizzare un valore è invece necessario richiamare il metodo edit di SharedPreferences. Questo metodo ritorna un oggetto Editor che permette di salvare valori usando i metodi putBoolean, putInt,putFloat, putLong e putString. Dopo aver richiamato uno o più di questi metodi dovrà essere richiamato anche il metodo commit, in caso contrario i valori non verranno effettivamente salvati.
Vediamo un semplice esempio che usa un oggetto SharedPreferences per memorizzare un boolean che indica se l’applicazione è già stata avviata altre volte. Nel caso in cui sia il primo avvio viene mostrato a video un messaggio usando la classe Toast:
1
2
3
4
5
6
7
8
9
10
11
12
| private void mostraToastPrimoAvvio()
{
SharedPreferences prefs = getPreferences(MODE_PRIVATE);
if (prefs.getBoolean(PRIMO_AVVIO, true))
{
Toast.makeText(this, R.string.primo_avvio,
Toast.LENGTH_LONG).show();
Editor prefsEditor = prefs.edit();
prefsEditor.putBoolean(PRIMO_AVVIO, false);
prefsEditor.commit();
}
} |
Conclusioni
Come vedete niente di complesso. Il risultato finale è questo, ovviamente lanciando una seconda volta l’applicazione il messaggio “Primo avvio” non verrà visualizzato:
By ImaginSystems & Queen Gin