2012-01-19 16 views
20

Hay algunos datos en mi aplicación de Android que me gustaría hacer una copia de seguridad y restaurar. Para tal fin, he creado una implementación personalizada de BackupAgent.onRestore no invocado para mi BackupAgent personalizado

En mi manifiesta en haber incluido el agente de copia de seguridad como se puede ver a continuación

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    android:installLocation="auto" 
    package="com.myapp" 
    android:versionCode="14" 
    android:versionName="1.13" > 

    <application 
     android:backupAgent="com.myapp.MyBackupAgent"> 

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

He incluido la clave API del servicio de copia de seguridad, a pesar de que estoy probando con el emulador (Android 2.2) y que no debería ser necesario, porque utiliza el transporte de copia de seguridad local.

Con el fin de hacer la prueba de la copia de seguridad y restaurar he hecho lo siguiente:

  • iniciar el emulador instalado con mi solicitud.
  • Activar respaldo

    adb shell BMGR permiten cierto

  • de llamadas por parte de mi código eran el método DataChanged en la clase BackupManager se llama.

  • iniciar manualmente la operación de copia de seguridad

    adb shell BMGR ejecutar

  • registramos en el registro que el método onBackup de mi costumbre BackupAgent fue llamado.

  • desinstalar la aplicación
  • Vuelva a instalar la aplicación
  • Comprobar en el registro si se llama al método OnRestore.

El hecho es que el método onRestore no parece ser llamado y no sé por qué. Después de volver a instalar la aplicación o activar manualmente la restauración con adb, veo lo siguiente en la consola.

$adb shell bmgr restore com.myapp 
restoreStarting: 2 packages 
restoreFinished: 0 
done 

y este otro en el registro de

D/AndroidRuntime(8259): 
D/AndroidRuntime(8259): >>>>>>>>>>>>>> AndroidRuntime START <<<<<<<<<<<<<< 
D/AndroidRuntime(8259): CheckJNI is ON 
D/AndroidRuntime(8259): --- registering native functions --- 
D/BackupManagerService( 59): MSG_RUN_RESTORE [email protected] 
V/LocalTransport( 59): start restore 1 
V/LocalTransport( 59): nextRestorePackage() = @[email protected] 
V/LocalTransport( 59): getRestoreData() found 7 key files 
V/LocalTransport( 59):  ... key=com.android.providers.settings size=1208 
V/LocalTransport( 59):  ... key=com.myapp size=501 
V/LocalTransport( 59):  ... key=android size=1208 
V/LocalTransport( 59):  ... key=com.android.providers.userdictionary size=1208 
V/LocalTransport( 59):  ... key=com.android.browser size=1208 
V/LocalTransport( 59):  ... key=com.android.inputmethod.latin size=1208 
V/LocalTransport( 59):  ... [email protected]@ size=11 
V/LocalTransport( 59): no more packages to restore 
V/LocalTransport( 59): finishRestore() 
V/LocalTransport( 59): finishRestore() 
D/AndroidRuntime(8259): Shutting down VM 

pero no veo que la llamada a OnRestore hecho realmente (tengo algunas declaraciones de registro justo en el comienzo de la misma?

¿Alguna vez le ha pasado esto? ¿Hay alguna razón por la que no se llama el método onRestore, incluso en el onBackup se llamó?

+2

Lo probé con un teléfono adecuado también, un Samsung Galaxy Nexus. Me aseguré de tener habilitada la copia de seguridad, tal como se describe en el siguiente enlace: http://support.verizonwireless.com/clc/devices/knowledge_base.html?id=51309 y veo esto en el registro 'W/BackupManagerService (196): pase de respaldo, pero e = verdadero p = falso', lo que significa que está habilitado pero no aprovisionado. ¿Por qué no está aprovisionado? – mollymay

+1

Tengo este problema hoy. onBackup llamado con éxito sin excepción pero onRestore no se llamó cuando se volvió a instalar la aplicación. ¿Has descubierto el motivo? ¡Gracias! – Loc

Respuesta

1

En mi experiencia, por alguna extraña razón (que Todavía tengo que identificarme), las declaraciones de registro realizadas en BackupAgents no aparecen en los registros. No obstante, he podido confirmar que el método onRestore es, de hecho, funciona correctamente.

En su pregunta, indica que el método onRestore "no parece ser llamado" porque no puede ver los registros adecuados. ¿Puede confirmar que el resultado está fallando (es decir, que los datos que deben restaurarse correctamente no lo están)?

+0

Es cierto. Creo que el OP debería verificar esto y volver. –

+0

En mi experiencia, en Android 5, se invocan sentencias de registro pero no se desencadenan puntos de interrupción de depuración. Parece que el proceso de restauración se ejecuta antes de que el depurador esté conectado. Eso podría crear cierta confusión sobre lo que está sucediendo al probar una aplicación. – arlomedia

1

Tuve este problema y la causa principal fue que tenía un error en mi onBackup que impedía que se completara, por lo que se llamó a OnBackup pero onRestore no.La corrección de la excepción en onBackup provocó que se llamara aRestore.

También los mensajes de registro en onBackup y onRestore se muestran en los registros. Si configura un filtro de registro en la etiqueta "copia de seguridad" y usa algo con una copia de seguridad para su etiqueta de registro. Verás la conexión desde el sistema y la tuya. Esto es lo que me pasa

09-08 17:06:56.581  294-352/system_process V/BackupServiceBinder﹕ doBackup() invoked 
09-08 17:06:56.591  294-352/system_process D/PerformBackupTask﹕ starting agent for backup of BackupRequest{pkg=android} 
09-08 17:06:56.591  294-352/system_process D/BackupManagerService﹕ awaiting agent for ApplicationInfo{40d5efc0 android} 
09-08 17:06:56.591  294-308/system_process D/BackupManagerService﹕ agentConnected pkg=android [email protected]8 
09-08 17:06:56.601  294-352/system_process V/BackupServiceBinder﹕ doBackup() invoked 
09-08 17:06:56.601  294-352/system_process D/BackupHelperDispatcher﹕ handling existing helper 'wallpaper' [email protected]150 
09-08 17:06:56.621  294-352/system_process D/PerformBackupTask﹕ starting agent for backup of BackupRequest{pkg=com.catglo.sellpr} 
09-08 17:06:56.661  294-352/system_process D/BackupManagerService﹕ awaiting agent for ApplicationInfo{41074748 com.catglo.sellpr} 
09-08 17:06:56.781  294-514/system_process D/BackupManagerService﹕ agentConnected pkg=com.catglo.sellpr [email protected] 
09-08 17:06:56.791 2263-2274/com.catglo.sellpr V/BackupServiceBinder﹕ doBackup() invoked 
09-08 17:06:56.791 2263-2274/com.catglo.sellpr I/backup﹕ onBackup called 
09-08 17:06:57.251  294-352/system_process I/PerformBackupTask﹕ Backup pass finished. 

en el registro anterior com.catglo.sellpr es de mi aplicación y la línea que dice com.catglo.sellpr I/copia de seguridad: onBackup llama es el mensaje de registro en mi código . Para el OnRestore Puedo obtener

09-08 17:13:34.431  294-352/system_process D/BackupManagerService﹕ MSG_RUN_RESTORE [email protected] 
09-08 17:13:34.511  294-352/system_process V/BackupServiceBinder﹕ doRestore() invoked 
09-08 17:13:34.561  294-352/system_process D/BackupManagerService﹕ awaiting agent for ApplicationInfo{41074748 com.catglo.sellpr} 
09-08 17:13:34.561  294-427/system_process D/BackupManagerService﹕ agentConnected pkg=com.catglo.sellpr [email protected] 
09-08 17:13:34.571 2263-2276/com.catglo.sellpr V/BackupServiceBinder﹕ doRestore() invoked 
09-08 17:13:34.571 2263-2276/com.catglo.sellpr I/backup﹕ onRestore called 

antes había una excepción en onBackup y mi registro de OnRestore nunca fue llamado pero los mensajes del sistema relacionados con la restauración fuera.

La aplicación no forzará cierre debido a una excepción en la copia de seguridad.

Cuestiones relacionadas