2015-11-23 3 views
1

Я создал службу Android Backup в моем приложении, используя пользовательский класс, который расширяет BackupAgentHelper ... это в основном выглядит следующим образом:BackupAgent подкласс используется для автоматического восстановления, но не в ручном режиме восстановления

public class MyBackups extends BackupAgentHelper { 

    @Override 
    public void onCreate() { 
     Log.d("MyBackups", "creating backup class"); 
     this.addDefaultHelper(); 

     String defaultSharedPrefsName = this.getPackageName() + "_preferences"; 
     SharedPreferencesBackupHelper defaultPrefsHelper = new SharedPreferencesBackupHelper(this, defaultSharedPrefsName); 
     this.addHelper("default_prefs", defaultPrefsHelper); 
    } 

    @Override 
    public void onBackup(ParcelFileDescriptor oldState, BackupDataOutput data, ParcelFileDescriptor newState) throws IOException { 
     Log.d("MyBackups", "backing up " + data); 
     super.onBackup(oldState, data, newState); 
    } 

    @Override 
    public void onRestore(BackupDataInput data, int appVersionCode, ParcelFileDescriptor newState) throws IOException { 
     Log.d("MyBackups", "restoring"); 
     super.onRestore(data, appVersionCode, newState); 
     // post-processing code goes here 
    } 
} 

У меня есть это зарегистрировано в файле манифеста, и если я удалю и переустановить приложение, он будет работать, как ожидалось, со всеми сообщениями журнала.

Однако, если я вручную запросить восстановление, как это ...

BackupManager backupManager = new BackupManager(getApplicationContext()); 
int error = backupManager.requestRestore(
    new RestoreObserver() { 
     public void restoreStarting(int numPackages) { 
      Log.d("MyBackups", "restoreStarting"); 
     } 

     public void restoreFinished(int error) { 
      Log.d("MyBackups", "restoreFinished"); 
     } 

     public void onUpdate(int nowBeingRestored, String currentPackage) { 
      Log.d("MyBackups", "onUpdate"); 
     } 
    } 
); 
Log.d("MyBackups", "requestRestore result: " + error); 

... restoreStarting и restoreFinished называются, а результат ошибки 0, но ни один из методов BackupAgentHelper не называются - - «создание резервных копий» и «восстановление» журналов не отображаются, и мой код после обработки не запускается. Кажется, что ручной запросRestore обходит мой собственный подкласс BackupAgentHelper.

Есть ли что-нибудь еще, что мне нужно для подключения к ручному восстановлению так же, как автоматическое восстановление? Вы пробовали это, и это работает для вас?

+0

BTW, я не думаю, что это дублированный вопрос из http://stackoverflow.com/questions/8928669/onrestore-not-invoked-for-my-custom-backupagent, потому что в моем случае автоматическое восстановление, когда переустановка приложения работает правильно, и только ручное восстановление с requestRestore имеет проблему. – arlomedia

ответ

0

Это старый вопрос, но я смог сделать это сегодня. Надеюсь, это поможет кому-то, имеющему ту же проблему.

Чтобы отправить запрос на резервное копирование, необходимо вызвать dataManager (BackupManager) BackupManager.

Затем, чтобы проверить его и пинать начать резервное копирование, вам нужно запустить

adb shell bmgr run 

Это будет вызывать OnCreate, OnBackup.

Затем после запуска backupManager.requestRestore вызывается метод OnCreate, OnRestore.

Заканчивать образец здесь, он делает именно это (при нажатии на кнопку Restore):

https://android.googlesource.com/platform/development/+/0b3758ea4e53f9bfd0b112eaa4a7dd7b7f4040f5/samples/BackupRestore?autodive=0%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F

Смотрите агент FileHelperExampleAgent.java.