| page.title=Using the Backup API |
| parent.title=Syncing to the Cloud |
| parent.link=index.html |
| |
| trainingnavtop=true |
| |
| next.title=Making the Most of Google Cloud Messaging |
| next.link=gcm.html |
| |
| @jd:body |
| |
| <div id="tb-wrapper"> |
| <div id="tb"> |
| <h2>This lesson teaches you to</h2> |
| <ol> |
| <li><a href="#register">Register for the Android Backup Service</a></li> |
| <li><a href="#manifest">Configure Your Manifest</a></li> |
| <li><a href="#agent">Write Your Backup Agent</a></li> |
| <li><a href="#backup">Request a Backup</a></li> |
| <li><a href="#restore">Restore from a Backup</a></li> |
| </ol> |
| <h2>You should also read</h2> |
| <ul> |
| <li><a |
| href="http://developer.android.com/guide/topics/data/backup.html">Data |
| Backup</a></li> |
| </ul> |
| </div> |
| </div> |
| |
| <p>When a user purchases a new device or resets their existing one, they might |
| expect that when Google Play restores your app back to their device during the |
| initial setup, the previous data associated with the app restores as well. By |
| default, that doesn't happen and all the user's accomplishments or settings in |
| your app are lost.</p> |
| <p>For situations where the volume of data is relatively light (less than a |
| megabyte), like the user's preferences, notes, game high scores or other |
| stats, the Backup API provides a lightweight solution. This lesson walks you |
| through integrating the Backup API into your application, and restoring data to |
| new devices using the Backup API.</p> |
| |
| <h2 id="register">Register for the Android Backup Service</h2> |
| <p>This lesson requires the use of the <a |
| href="http://code.google.com/android/backup/index.html">Android Backup |
| Service</a>, which requires registration. Go ahead and <a |
| href="http://code.google.com/android/backup/signup.html">register here</a>. Once |
| that's done, the service pre-populates an XML tag for insertion in your Android |
| Manifest, which looks like this:</p> |
| <pre> |
| <meta-data android:name="com.google.android.backup.api_key" |
| android:value="ABcDe1FGHij2KlmN3oPQRs4TUvW5xYZ" /> |
| </pre> |
| <p>Note that each backup key works with a specific package name. If you have |
| different applications, register separate keys for each one.</p> |
| |
| |
| <h2 id="manifest">Configure Your Manifest</h2> |
| <p>Use of the Android Backup Service requires two additions to your application |
| manifest. First, declare the name of the class that acts as your backup agent, |
| then add the snippet above as a child element of the Application tag. Assuming |
| your backup agent is going to be called {@code TheBackupAgent}, here's an example of |
| what the manifest looks like with this tag included:</p> |
| |
| <pre> |
| <application android:label="MyApp" |
| android:backupAgent="TheBackupAgent"> |
| ... |
| <meta-data android:name="com.google.android.backup.api_key" |
| android:value="ABcDe1FGHij2KlmN3oPQRs4TUvW5xYZ" /> |
| ... |
| </application> |
| </pre> |
| <h2 id="agent">Write Your Backup Agent</h2> |
| <p>The easiest way to create your backup agent is by extending the wrapper class |
| {@link android.app.backup.BackupAgentHelper}. Creating this helper class is |
| actually a very simple process. Just create a class with the same name as you |
| used in the manifest in the previous step (in this example, {@code |
| TheBackupAgent}), |
| and extend {@code BackupAgentHelper}. Then override the {@link |
| android.app.backup.BackupAgent#onCreate()}.</p> |
| |
| <p>Inside the {@link android.app.backup.BackupAgent#onCreate()} method, create a {@link |
| android.app.backup.BackupHelper}. These helpers are |
| specialized classes for backing up certain kinds of data. The Android framework |
| currently includes two such helpers: {@link |
| android.app.backup.FileBackupHelper} and {@link |
| android.app.backup.SharedPreferencesBackupHelper}. After you create the helper |
| and point it at the data you want to back up, just add it to the |
| BackupAgentHelper using the {@link android.app.backup.BackupAgentHelper#addHelper(String, BackupHelper) addHelper()} |
| method, adding a key which is used to |
| retrieve the data later. In most cases the entire |
| implementation is perhaps 10 lines of code.</p> |
| |
| <p>Here's an example that backs up a high scores file.</p> |
| |
| <pre> |
| import android.app.backup.BackupAgentHelper; |
| import android.app.backup.FileBackupHelper; |
| |
| |
| public class TheBackupAgent extends BackupAgentHelper { |
| // The name of the SharedPreferences file |
| static final String HIGH_SCORES_FILENAME = "scores"; |
| |
| // A key to uniquely identify the set of backup data |
| static final String FILES_BACKUP_KEY = "myfiles"; |
| |
| // Allocate a helper and add it to the backup agent |
| @Override |
| void onCreate() { |
| FileBackupHelper helper = new FileBackupHelper(this, HIGH_SCORES_FILENAME); |
| addHelper(FILES_BACKUP_KEY, helper); |
| } |
| } |
| </pre> |
| <p>For added flexibility, {@link android.app.backup.FileBackupHelper}'s |
| constructor can take a variable number of filenames. You could just as easily |
| have backed up both a high scores file and a game progress file just by adding |
| an extra parameter, like this:</p> |
| <pre> |
| @Override |
| void onCreate() { |
| FileBackupHelper helper = new FileBackupHelper(this, HIGH_SCORES_FILENAME, PROGRESS_FILENAME); |
| addHelper(FILES_BACKUP_KEY, helper); |
| } |
| </pre> |
| <p>Backing up preferences is similarly easy. Create a {@link |
| android.app.backup.SharedPreferencesBackupHelper} the same way you did a {@link |
| android.app.backup.FileBackupHelper}. In this case, instead of adding filenames |
| to the constructor, add the names of the shared preference groups being used by |
| your application. Here's an example of how your backup agent helper might look if |
| high scores are implemented as preferences instead of a flat file:</p> |
| |
| <pre> |
| import android.app.backup.BackupAgentHelper; |
| import android.app.backup.SharedPreferencesBackupHelper; |
| |
| public class TheBackupAgent extends BackupAgentHelper { |
| // The names of the SharedPreferences groups that the application maintains. These |
| // are the same strings that are passed to getSharedPreferences(String, int). |
| static final String PREFS_DISPLAY = "displayprefs"; |
| static final String PREFS_SCORES = "highscores"; |
| |
| // An arbitrary string used within the BackupAgentHelper implementation to |
| // identify the SharedPreferencesBackupHelper's data. |
| static final String MY_PREFS_BACKUP_KEY = "myprefs"; |
| |
| // Simply allocate a helper and install it |
| void onCreate() { |
| SharedPreferencesBackupHelper helper = |
| new SharedPreferencesBackupHelper(this, PREFS_DISPLAY, PREFS_SCORES); |
| addHelper(MY_PREFS_BACKUP_KEY, helper); |
| } |
| } |
| </pre> |
| |
| <p>You can add as many backup helper instances to your backup agent helper as you |
| like, but remember that you only need one of each type. One {@link |
| android.app.backup.FileBackupHelper} handles all the files that you need to back up, and one |
| {@link android.app.backup.SharedPreferencesBackupHelper} handles all the shared |
| preferencegroups you need backed up. |
| </p> |
| |
| |
| <h2 id="backup">Request a Backup</h2> |
| <p>In order to request a backup, just create an instance of the {@link |
| android.app.backup.BackupManager}, and call it's {@link |
| android.app.backup.BackupManager#dataChanged()} method.</p> |
| |
| <pre> |
| import android.app.backup.BackupManager; |
| ... |
| |
| public void requestBackup() { |
| BackupManager bm = new BackupManager(this); |
| bm.dataChanged(); |
| } |
| </pre> |
| |
| <p>This call notifies the backup manager that there is data ready to be backed |
| up to the cloud. At some point in the future, the backup manager then calls |
| your backup agent's {@link |
| android.app.backup.BackupAgent#onBackup(ParcelFileDescriptor, BackupDataOutput, |
| ParcelFileDescriptor) onBackup()} method. You can make |
| the call whenever your data has changed, without having to worry about causing |
| excessive network activity. If you request a backup twice before a backup |
| occurs, the backup only occurs once.</p> |
| |
| |
| <h2 id="restore">Restore from a Backup</h2> |
| <p>Typically you shouldn't ever have to manually request a restore, as it |
| happens automatically when your application is installed on a device. However, |
| if it <em>is</em> necessary to trigger a manual restore, just call the |
| {@link android.app.backup.BackupManager#requestRestore(RestoreObserver) requestRestore()} method.</p> |