Хорошо, поэтому я пытаюсь реализовать Data Backup в своем приложении и следую этому руководству . Я реализовал свой BackupAgentHelper
с помощью SharedPreferencesBackupHelper
. Я не получаю никаких ошибок, и я уверен, что вы вызове dataChanged()
после всех изменений предпочтений, но когда я тестирую резервную копию (`bbgr run adb shell), я получаю эту информацию в 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
Итак, для справки, в моем манифесте я добавил:
<application android:allowBackup="true" android:backupAgent="com.kcoppock.sudoku.SudokuBackupAgent"
так же как
<meta-data android:name="com.google.android.backup.api_key" android:value="my_key_goes_here" />
И моя BackupAgentHelper реализована так:
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); } }
И, наконец, в моем основном действии я призываю к резервному копированию данных следующим образом:
edit.putString(id + "_values", valueCache.toString()); edit.putString(id + "_hints", hintCache.toString()); edit.commit(); BackupManager backup = new BackupManager(this); backup.dataChanged();
Я пробовал отладку, и кажется, что мой onCreate()
в SudokuBackupAgent
никогда не вызывается. Или, по крайней мере, это никогда не достигается из отладчика. Кажется, что он не находит никаких обновленных данных, и я дважды проверял, чтобы обеспечить их резервное копирование. Здесь что-то не хватает?
EDIT : я должен добавить, я тестирую на устройстве (Galaxy Nexus), и я даже пытался использовать APK с экспортированным выпуском для тестирования.
1) Поместите Log.i () в свой onCreate, чтобы узнать, вызвана ли она.
2) Logcat указывает, что ваша функция ничего не записывала. Проверьте, есть ли файл share_prefs / SCORES в частной папке вашего приложения (предполагается использование соответствующего файлового менеджера на корневом устройстве). Это файл, который вы пытаетесь создать в резервной копии. Вероятно, ваш файл настроек – это нечто иное, чем этот файл, в таком случае исправьте String SCORES, чтобы отобразить файл реальных настроек.
3) Я попытался отлаживать BackupAgentHelper.onCreate в своем приложении, и его можно отлаживать после вызова adb shell bmgt … поэтому здесь можно отступить в отладчике.
Сегодня у меня была такая же проблема с 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()
Если вы не измените данные своих настроек, он будет только один раз, но не позже.
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 Transport. Проверьте dev docs на этом.