22

Alright, so I'm trying to implement Data Backup into my application, and have been following this guide. I've implemented my BackupAgentHelper using a SharedPreferencesBackupHelper. I don't get any errors, and I'm being sure to call dataChanged() after all preference changes, but when I test the backup (`adb shell bmgr run) I get this information in LogCat:

07-07 12:29:00.258: V/BackupManagerService(291): Scheduling immediate backup pass
07-07 12:29:00.258: V/BackupManagerService(291): Running a backup pass
07-07 12:29:00.258: V/BackupManagerService(291): clearing pending backups
07-07 12:29:00.258: V/PerformBackupTask(291): Beginning backup of 1 targets
07-07 12:29:00.289: V/BackupServiceBinder(291): doBackup() invoked
07-07 12:29:00.289: D/PerformBackupTask(291): invokeAgentForBackup on @pm@
07-07 12:29:00.297: I/PerformBackupTask(291): no backup data written; not calling transport

So for reference, in my manifest I've added:

<application
        android:allowBackup="true"
        android:backupAgent="com.kcoppock.sudoku.SudokuBackupAgent"

as well as

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

and my BackupAgentHelper is implemented like so:

public class SudokuBackupAgent extends BackupAgentHelper {
    static final String SCORES = "SCORES";
    static final String BACKUP_ID = "sudoku_backup";

    @Override
    public void onCreate() {
        SharedPreferencesBackupHelper backupHelper = 
                new SharedPreferencesBackupHelper(this, SCORES);
        addHelper(BACKUP_ID, backupHelper);
    }
}

and finally, in my main activity, I call for a data backup like this:

edit.putString(id + "_values", valueCache.toString());
edit.putString(id + "_hints", hintCache.toString());
edit.commit();
BackupManager backup = new BackupManager(this);
backup.dataChanged();

I've tried debugging, and it seems my onCreate() in SudokuBackupAgent is never called. Or at least it's never reached from the debugger. It seems it isn't finding any updated data, and I have double checked to ENSURE there is data to be backed up. Is there something I'm missing here?

EDIT: I should add, I'm testing on a device (Galaxy Nexus), and I've even tried using an exported release APK for testing purposes.

4

3 に答える 3

3

1) Log.i() を onCreate に入れて、それが呼び出されるかどうかを確認します。

2) Logcat は、関数が何も書き込んでいないことを示しています。アプリのプライベート フォルダーに shared_prefs/SCORES ファイルがあるかどうかを確認します (ルート化されたデバイスで適切なファイル マネージャーを使用することを前提としています)。これは、バックアップしようとしているファイルです。おそらく、設定ファイルはこのファイルとは別のものです。そのような場合、実際の設定ファイルを反映するように String SCORES を修正してください。

3) アプリで BackupAgentHelper.onCreate をデバッグしようとしましたが、adb shell bmgt を呼び出した後にデバッグできるため、デバッガーでここにステップすることができます。

于 2012-07-10T06:57:08.673 に答える
2

今日、Android SDK 4.1 で同じ問題が発生しました。ただし、バージョン 2.3.3 を使用すると、次のことが役立ちました。

07-15 13:59:56.459: V/LocalTransport(61): performBackup() pkg=com........
07-15 13:59:56.469: V/LocalTransport(61): Got change set key=filehelper:../databases/database.db size=8208 key64=ZmlsZWhlbHBlcjouLi8kYXRhYmFzZXMvZXhwZW5zZXIuZGI=
07-15 13:59:56.469: V/LocalTransport(61):   data size 8208
07-15 13:59:56.469: V/LocalTransport(61): finishBackup()
于 2012-07-15T14:01:57.623 に答える
2

設定データを変更しない場合、一度だけバックアップされ、その後はバックアップされません。

https://developer.android.com/reference/android/app/backup/SharedPreferencesBackupHelper.html

「バックアップが実行されるたびに、最後のバックアップ操作以降に変更されたすべての名前付き共有設定がバックアップされます。」

他のポスターが言ったように、onCreateにログステートメントがあることを確認してください。

次の方法でバックアップを強制できます。

// bmgr wipe TRANSPORT PACKAGE
bmgr wipe com.google.android.backup/.BackupTransportService com.kcoppock.sudoku

bmgr run

デフォルトは ですがcom.google.android.backup/.BackupTransportService、自分で確認するのが最善bmgr list transportsです。

デフォルトの Google トランスポートではなく、ローカル トランスポートに対して実行する方がずっと快適です。これに関する開発ドキュメントを確認してください。

于 2012-09-26T23:52:01.940 に答える