Подкласс BackupAgent, используемый для автоматического восстановления, но не для восстановления вручную

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

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 не вызывается — журналы «создание класса резервного копирования» и «восстановление» не появляются, и мой код постобработки не т беги. Кажется, что ручной requestRestore обходит мой собственный подкласс BackupAgentHelper.

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


person arlomedia    schedule 23.11.2015    source источник
comment
Кстати, я не думаю, что это дублирующий вопрос из stackoverflow.com/questions/8928669/, потому что в моем случае автоматическое восстановление при переустановке приложения работает правильно, и проблема возникает только при ручном восстановлении с помощью requestRestore.   -  person arlomedia    schedule 23.11.2015


Ответы (1)


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

Вам нужно вызвать BackupManager dataChanged(), чтобы отправить запрос на резервное копирование.

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

adb shell bmgr run

Это вызовет OnCreate, OnBackup.

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

Посмотрите пример здесь, он делает именно это (когда вы нажимаете кнопку «Восстановить»):

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

См. агент FileHelperExampleAgent.java.

person live-love    schedule 20.02.2018