Backup e cambio di tema con le API di Android

Roberto Orgiu
Roberto Orgiu
Backup e cambio di tema con le API di Android

Come tutti sappiamo Android è caratterizzato, almeno da Ice Cream Sandwich in poi, dal tema Holo, che i ragazzi di Mountain View ci hanno rilasciato in diverse varianti, spingendoci ad utilizzarle per creare i nostri software. Ma come possiamo fare per scegliere tra i temi al momento del lancio dell'applicazione?

Il modo più semplice è senz'altro quello di salvarci il tema scelto nelle SharedPreferences e richiamarlo attraverso il metodo setTheme() di Context, ma questo ha alcune regole cui dobbiamo, necessariamente, sottostare:

  • il metodo va assolutamente chiamato prima di setContentView(), altrimenti non avrà effetto (va eseguito prima che venga disegnata l'Activity, altrimenti viene fermato dal runtime di Android)
  • per ogni nuova Activity che lanciamo, va richiamato, se vogliamo una continuità, altrimenti setContentView applicherà il tema specificato nel layout della singola Activity
  • dobbiamo ricaricare la prima Activity, se vogliamo che il tema venga applicato subito.

L'utilizzo di questo metodo è immediato e comporta solamente l'inserzione del tema come parametro:

setTheme(android.R.style.Theme_Holo);

E se volessimo invece salvare i nostri dati, in modo che l'utente possa ripristinarli quando installa l'applicazione su un altro dispositivo? Per questa specifica situazione, Google ci mette a disposizione un piccolo spazio, dove la nostra applicazione potrà effettuare un backup di file o preferenze: prima di iniziare a scrivere codice, dobbiamo quindi registrare la nostra applicazione sull'apposita pagina del portale per sviluppatori di Google, in modo da ottenere la chiave, che dovremo poi inserire nel nostro Manifest, nel tag relativo all'applicazione:

<application>
<meta-data android:name="com.google.android.backup.api_key"
android:value="AEdPqrEAAAAIXCOFOMfvAC8FViyU6A2NvyZPBwjp3xCxcHGdKw" />
</application>

A questo punto, iniziamo a creare il backup manager, che si occuperà di richiedere il salvataggio dei dati: per fare ciò, dobbiamo estendere la classe BackupAgentHelper e aggiungere al gruppo di preferenze (o al file) che vogliamo salvare un helper, che ci garantirà una richiesta di backup ogni volta che, attraverso il metodo dataChanged(), notifichiamo al servizio che abbiamo modificato i dati.

public class SimpleBackup extends BackupAgentHelper{
public void onCreate() {
SharedPreferencesBackupHelper helper = new SharedPreferencesBackupHelper(this, C.prefName);
addHelper(C.prefBackupName,helper);
}
}

Ora che il nostro backup manager è finito, dobbiamo scriverci un metodo per notificare al nostro applicativo che vogliamo effettuare una richiesta di backup:

public static final void requestBackup(Context mContext){
BackupManager b = new BackupManager(mContext);
b.dataChanged();
Toast.makeText(mContext, "Backup richiesto", Toast.LENGTH_SHORT).show();
}

A questo punto, richiamando il metodo requestBackup() appena scritto, otterremo la nostra richiesta, ma ci manca ancora un tassello: la richiesta e il backup manager non sono ancora collegati in nessun modo e, per connetterli, dobbiamo nuovamente mettere mano al nostro file Manifest, precisamente nel tag su cui abbiamo già agito, application, inserendo il nome del nostro helper del backup:

<application
android:allowBackup="true"
...
android:backupAgent="SimpleBackup">

Per quanto riguarda il ripristino dei nostri dati, Google dice che, normalmente, non si ha bisogno di chiamare il metodo requestRestore(), in quanto viene automaticamente chiamato dal sistema operativo al momento dell'installazione del software ma se, mentre l'utente non aveva il software installato, ci fosse stato anche solo un singolo avanzamento di versione, i dati non verrebbero ripristinati, perché il sistema dà per scontato che abbiamo apportato modifiche tali da impedire il corretto funzionamento del backup; per evitare questo comportamento, dobbiamo inserire nel nostro Manifest (nel tag application, tanto per cambiare), la dicitura:

android:restoreAnyVersion="true"

per far sì che il servizio ignori la versione del nostro backup e lasci gestire a noi come ripristinare i dati a seconda della versione del nostro software, magari ricorrendo alle API del Package Manager, come suggerito dalla guida per gli sviluppatori.

Come di consueto, trovate i sorgenti e l'APK di prova sull'apposito thread del nostro forum, e buona programmazione a tutti!

Fonte: