Android SharedPreferences Резервное копирование не работает - PullRequest
7 голосов
/ 02 марта 2011

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

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

Манифест Android (отрывок)

<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);
    }
}

И, наконец, команды для запуска резервного копирования во время выполнения. В моем приложении этот код запускается из класса, доступного моему приложению (не основного действия), который передается this в качестве контекста при создании и затем сохраняется в закрытой переменной 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

1 Ответ

5 голосов
/ 25 января 2012

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

BackupManager mBackupManager = new BackupManager(getApplicationContext());

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

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

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

mBackupManger.dataChanged();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...