13 October 2014
這篇要講Android自己的backup service
其實使用起來蠻簡單的,
主要分成下面4個步驟,

1. Register for Android Backup Service

首先要先去註冊一個API Key,先到這個網站
進去以後輸入你的package name,接著就會給你一組API key.
這樣就註冊完成.

2. Configuration

完成上面的註冊以後,接著要對你的project做configuration,
先開啟你的AndroidManifest.xml,
先在application element加上一個android:backupAgent這個attribute,
這個attribute的名字,就是待會你新增的class名稱,
<application android:label="MyApp"
android:backupAgent="ExpenseBackupAgent">

接著在application之中,加入下段的meta data,
記得把xxxxxxxxxx換成你剛剛註冊的API Key,
<meta-data android:name="com.google.android.backup.api_key"
android:value="xxxxxxxxxxxxxxxxxxx" />

3. Backup internal database

接著新增一個Class,這個Class要繼承BackupAgentHelper,
記得這Class名稱要跟你manifest.xml中的一樣!
這裡要題外話一下,其實你也可以繼承BackupAgent,
當你如果需要做到更複雜的backup時,
例如你不想backup整份file,你只想backup某個"部分"的data,
這時候你只能透過BackupAgent去做到,
而BackupAgentHelper其實也只是BackupAgent的一個wrapper,
讓你更輕易的backup和restore罷了.
回到主題,先新增一個class繼承BackupAgentHelper,內容如下,
在onCreate裡面用到了FileBackupHelper,
最原始的FileBackupHelper是真的用來backup某個file,
但因為我們這裡要backup db,
所以我們要override掉getFilesDir,
在getFilesDir中去拿db的路徑,
然後透過FileBackupHelper去做backup!
只要透過下面的code就可以幫你自動backup和restore了!

public class ExpenseBackupAgent extends BackupAgentHelper {
private static final String DB_NAME = "expense"; // db名稱
private static final String TAG = ExpenseBackupAgent.class
.getCanonicalName();

@Override
public void onCreate() {
Log.e(TAG, "backu db");
FileBackupHelper dbs = new FileBackupHelper(this, DB_NAME);
addHelper("dbs", dbs);
}

@Override
public File getFilesDir() {
final File f = getDatabasePath(DB_NAME);
return f.getParentFile();
}
}


雖然說backup和restore都是自動的,
那麼要怎麼主動的去request backup?
那就要用BackupManager了,
透過dataChanged,會去幫你queue這個backup的job,
為什麼是說queue呢?因為backup不會馬上執行的!
都是批次的執行!
BackupManager bm = new BackupManager(this);
bm.dataChanged();

4. Test

上面說到了Backup都是批次執行,不是即時的,那我該怎測試呢?
要透過adb了,
adb shell bmgr backup packagename  # 等於dataChanged
adb shell bmgr run # 立即去trigger backup job
adb uninstall packagename # 先刪掉app
最後再安裝一次你的app,
打開以後應該會發現你的資料都還在!










blog comments powered by Disqus