7

He estado haciendo mi tarea sobre cómo hacer una copia de seguridad de las Preferencias Compartidas en mi aplicación Android, especialmente utilizando la reflexión para mantener la compatibilidad con versiones anteriores. Al menos lo he estado intentando. Lamentablemente, ninguno de mi código realmente termina creando una copia de seguridad. Esto incluye forzar adb bmgr comandos en el emulador como se explica here. Entonces, me pregunto si la comunidad podría ayudarme y en el proceso encontrar una mejor documentación.Android SharedPreferences Copia de seguridad no funciona

Aquí está mi código. Para mantener esto tan genérico como sea posible para otros, simplemente llamaré a mi aplicación Andy con un nombre de paquete de com.example.andy.

Android Manifiesto (extracto)

<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

Nota: /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); 
    } 
} 

Y, por último, los comandos para iniciar una copia de seguridad durante el tiempo de ejecución. En mi aplicación, este código se ejecuta desde una clase disponible para mi aplicación (no la actividad principal) que se transfiere como como contexto al momento de la creación y luego se almacena en la variable privada 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(); 
    } 
} 

En resumen, ni la función por encima ni por los siguientes comandos de hecho copia de seguridad todos los datos:

$ adb shell bmgr enable true 
$ adb shell bmgr backup com.example.andy 
$ adb shell bmgr run 

Respuesta

5

En su actividad de llamadas (el primero que se inicia en su aplicación), es necesario crear una instancia de BackupManager :

BackupManager mBackupManager = new BackupManager(getApplicationContext()); 

Esto le indicará al administrador de respaldo que busque el archivo de respaldo y lo cargue.

Debe asegurarse de que el archivo de preferencias tenga el formato "packagename_preferences", por ej. andy_preferences. Y use el mismo nombre cuando guarde sus preferencias por primera vez. (! Muy importante)

Después de los ajustes de su actividad a través de apply() guarda o commit(), es necesario contar BackupManager que algo ha cambiado por lo que incluyen inmediatamente después:

mBackupManger.dataChanged(); 
Cuestiones relacionadas