Использование службы резервного копирования Android для резервного копирования моих общих настроек

Я намерен реализовать службу резервного копирования для своего приложения, сохраняя свойства конфигурации облака при внесении изменений и извлекая их при первом запуске приложения.

Но у меня есть некоторые проблемы: процесс резервного копирования сделан неправильно.

Мой манифест Android содержит следующее:

<application
    ...
    android:label="@string/app_name"
    android:theme="@style/AppTheme" 
    android:allowBackup="true"
    android:backupAgent=".backup.BizkaimoveBackup">
        ...

        <!-- Android Backup -->
        <meta-data 
            android:name="com.google.android.backup.api_key" 
            android:value="--key--" />
        <!-- Android Backup -->

Класс BackupAgentHelper содержит:

public class BizkaimoveBackup extends BackupAgentHelper {

    /*
     * Atributos
     */
    private static String LOG_TAG = "BizkaimoveBackup";
    private SharedPreferencesBackupHelper spbh;

    /**
     * El nombre del fichero de SharedPreferences: el mismo que hay en globales.
     */
    private static String PREFS = "bizkaimovePrefs";

    /**
     * Una clave para identificar unequívocamente un conjunto de datos de backup
     */
    private static final String PREFS_BACKUP_KEY = "myprefs";

    /*
     * Métodos
     */
    @Override
    public void onCreate() {
        spbh = new SharedPreferencesBackupHelper(this, PREFS);
        addHelper(PREFS, spbh);
        Log.d(LOG_TAG, "Añadiendo BackupAgent...");
    }

}

Чтобы сохранить изменения в облаке, я делаю следующее:

switchPreferenceIdiomaEs = (SwitchPreference) findPreference("pref_switch_idioma_es");
    switchPreferenceIdiomaEu = (SwitchPreference) findPreference("pref_switch_idioma_eu");

    switchPreferenceIdiomaEs.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {

        @Override
        public boolean onPreferenceChange(Preference preference, Object newValue) {
            //newValue es boolean aquí
            SharedPreferences sp = getActivity().getSharedPreferences("bizkaimovePrefs", Context.MODE_PRIVATE);
            Editor spEditor = sp.edit();
            spEditor.putBoolean("idiomaEsCastellano", (Boolean) newValue);
            spEditor.putBoolean("idiomaEsEuskera", !((Boolean) newValue));
            spEditor.commit();
            switchPreferenceIdiomaEu.setChecked(!((Boolean) newValue));

            BackupManager.dataChanged("com.ingartek.bizkaimove");

            return true;
        }
    });

Файл XML preferences.xml содержит следующее:

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" 
    android:key="bizkaimovePrefs"
    android:persistent="true"
    android:id="@+id/listaPrefs">

    <PreferenceCategory
        android:title="@string/config_idioma">

        <!-- Un switch para euskera, otro para castellano -->
        <SwitchPreference 
            android:key="pref_switch_idioma_eu"
            android:title="@string/config_euskera"
            android:switchTextOn="@string/config_euskera"
            android:switchTextOff="@string/config_castellano"/>

        <SwitchPreference 
            android:key="pref_switch_idioma_es"
            android:title="@string/config_castellano"
            android:switchTextOn="@string/config_castellano"
            android:switchTextOff="@string/config_euskera"/>

    </PreferenceCategory>
    ...

И, наконец, в onCreate() HomeActivity я делаю следующее:

BackupManager bm = new BackupManager(this);
        bm.requestRestore(new RestoreObserver() {

            @Override
            public void restoreStarting(int numPackages) {
                Toast.makeText(getApplicationContext(), "Empezando recuperación de backup...", Toast.LENGTH_SHORT).show();
                super.restoreStarting(numPackages);
            }

            @Override
            public void restoreFinished(int error) {
                Toast.makeText(getApplicationContext(), "Recuperación de backup finalizada. Error: " + error, Toast.LENGTH_SHORT).show();
                super.restoreFinished(error);

Однако после выполнения описанных здесь действий http://developer.android.com/guide/topics/data/backup.html#Testing никакие данные не извлекаются после удаления моего приложения.

Мне удалось загрузить и протестировать этот https://bitbucket.org/andreaskristensson/android-example-preference-fragment-and-backup-api/downloads, но это не работает.

Что я делаю неправильно?

Заранее спасибо.


person russellhoff    schedule 15.01.2015    source источник
comment
Из ваших отчетов журнала вы можете увидеть, вызывается ли ваш BackupAgent для выполнения резервного копирования? Тестирование на локальном резервном транспорте намного проще, чем на транспорте Google.   -  person Hayes Haugen    schedule 26.01.2015
comment
как я могу это сделать, @HayesHaugen?   -  person russellhoff    schedule 27.01.2015
comment
Посмотрите здесь developer.android.com/tools/help/bmgr.html   -  person dVaffection    schedule 11.02.2016


Ответы (1)


Наконец-то я понял, в чем моя проблема...

Я создал еще один файл, и некоторые настройки были сохранены там, а остальные были сохранены в XML-файле настроек по умолчанию.

Таким образом, менеджер резервного копирования работал ТОЛЬКО с одним из них.

person russellhoff    schedule 11.02.2016