7

私は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
4

1 に答える 1

5

メインの通話アクティビティ(アプリで最初に開始するアクティビティ)では、インスタンス化する必要がありますBackupManager

BackupManager mBackupManager = new BackupManager(getApplicationContext());

これにより、backupmanagerはバックアップファイルを探してロードするように指示されます。

設定ファイルがフォーマットであることを確認する必要があります"packagename_preferences"。andy_preferences。また、最初に設定を保存したときに同じ名前を使用します。(非常に重要です!)

設定アクティビティがapply()またはを介して保存した後、何かが変更されたことcommit()を通知する必要がBackupManagerあるため、直後に含めます。

mBackupManger.dataChanged();
于 2012-01-25T09:25:31.637 に答える