Резервное копирование файлов Android SharedPreferences

Я делал домашнее задание о том, как создавать резервные копии SharedPreferences в приложении для Android, особенно используя рефлексию для поддержки обратной совместимости. По крайней мере, я пытался. К сожалению, ни один из моих кодов фактически не создает резервную копию! Это включает в себя принудительное выполнение команд adb bmgr на эмуляторе, как описано здесь . Так что мне интересно, может ли сообщество помочь мне и в процессе придумать лучшую документацию?

Вот мой код. Чтобы сделать это как можно более общим для других, я просто позвоню своему приложению Andy с именем пакета com.example.andy .

Android Manifest (выдержка)

<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 

Solutions Collecting From Web of "Резервное копирование файлов Android SharedPreferences"

В своей основной деятельности по вызову (сначала запускаемой в вашем приложении) вам необходимо создать экземпляр BackupManager :

 BackupManager mBackupManager = new BackupManager(getApplicationContext()); 

Это скажет backupmanager искать файл резервной копии и загрузить его.

Вам нужно убедиться, что файл настроек имеет формат "packagename_preferences" например. andy_preferences. И используйте одно и то же имя при первом сохранении ваших предпочтений. (Очень важно!)

После сохранения активности настроек с помощью apply() или commit() вам нужно сообщить BackupManager , что что-то изменилось, поэтому BackupManager сразу же:

 mBackupManger.dataChanged();