私はAndroidアプリケーションでSharedPreferencesをバックアップする方法、特に下位互換性を維持するためにリフレクションを使用する方法について宿題をしています。少なくとも私は試してきました。残念ながら、私のコードはどれも実際にはバックアップを作成することにはなりません!これには、ここで説明するように、エミュレーターでadbbmgrコマンドを強制することが含まれます。だから私はコミュニティがおそらく私を助けてくれるのだろうか、そしてその過程でいくつかのより良いドキュメントを考え出すことができるのだろうか?
これが私のコードです。これを他の人にとって可能な限り一般的なものにするために、 com.example.andyというパッケージ名でアプリケーションAndyを呼び出すだけです。
Androidマニフェスト(抜粋)
<application
...
android:backupAgent="com.example.andy.backupHelper"
android:restoreAnyVersion="true">
...
<meta-data
android:name="com.google.android.backup.api_key"
android:value="GIVEN KEY GOES HERE" />
...
backupHelper.java
注:/data/data/com.example.andy/shared_prefs/com.example.andy_preferences.xml
package com.example.andy;
import android.app.backup.BackupAgentHelper;
import android.app.backup.SharedPreferencesBackupHelper;
public class BlinkyBackup extends BackupAgentHelper {
static final String PREFS_FILE = "andy_preferences";
static final String BACKUP_KEY = "AndyPreferencesBackup";
public void onCreate() {
SharedPreferencesBackupHelper backupHelper = new SharedPreferencesBackupHelper(this, PREFS_FILE);
addHelper(BACKUP_KEY, backupHelper);
}
}
BackupAgentWrapper
package com.example.andy;
import android.app.backup.BackupManager;
import android.content.Context;
public class BackupAgentWrapper {
private BackupManager wrappedInstance;
static {
try {
Class.forName("android.app.backup.BackupManager");
}
catch (Exception e) {
throw new RuntimeException(e);
}
}
public static void checkAvailable() {}
public void dataChanged() {
wrappedInstance.dataChanged();
}
public BackupAgentWrapper(Context ctx) {
wrappedInstance = new BackupManager(ctx);
}
}
そして最後に、実行時にバックアップを開始するコマンド。私のアプリケーションでは、このコードは、アプリケーションで使用可能なクラス(メインアクティビティではない)から実行され、作成時にコンテキストとして渡され、プライベート変数mContextに格納されます。
private void backupData() {
boolean backupAgentAvailable = false;
try {
BackupAgentWrapper.checkAvailable();
backupAgentAvailable = true;
}
catch (Throwable t) {
// really nothing to do
}
if(backupAgentAvailable) {
BackupAgentWrapper backupWrapper = new BackupAgentWrapper(mContext);
backupWrapper.dataChanged();
}
}
要約すると、上記の関数も以下のコマンドも実際にはデータをバックアップしません。
$ adb shell bmgr enable true
$ adb shell bmgr backup com.example.andy
$ adb shell bmgr run