2012-01-19 17 views
20

Nella mia app Android ci sono alcuni dati che desidero eseguire il backup e il ripristino. A tale scopo ho creato un'implementazione personalizzata di BackupAgent.onRestore non richiamato per il mio BackupAgent personalizzato

Nel mio manifesta hanno incluso l'agente di backup, come potete vedere qui sotto

<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" /> 

ho incluso la chiave API servizio di backup, anche se sto testando con l'emulatore (Android 2.2) e non dovrebbe essere necessario, perché utilizza il trasporto di backup locale.

Al fine di fare il test del backup e il ripristino ho fatto quanto segue:

  • avviare l'emulatore con la mia domanda installata.
  • Attiva il backup di

    adb shell BMGR abilitare vero

  • chiamata la parte del mio codice erano il metodo DataChanged nella classe BackupManager si chiama.

  • avviare manualmente l'operazione di backup

    adb shell BMGR gestita

  • Controllato nel registro che il metodo onBackup di mia abitudine BackupAgent è stato chiamato.

  • disinstallare l'applicazione
  • Reinstallare l'applicazione
  • Verificare nel registro se il metodo viene chiamato OnRestore.

Il fatto è che il metodo onRestore non sembra essere chiamato e non so perché. Dopo aver reinstallato l'app o attivato manualmente il ripristino con adb, vedo quanto segue nella console.

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

e quest'altro nel registro

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 

ma non vedo che la chiamata a OnRestore è in realtà fatta (io ho alcune dichiarazioni di registrazione solo all'inizio di esso?

È mai successo a te? C'è un motivo per cui il metodo onRestore non viene chiamato, anche nel onBackup è stato chiamato?

+2

Ho appena provato con un telefono corretto, un Samsung Galaxy Nexus. Mi sono reso sicuro di avere il backup abilitato, così come è descritto nel seguente link: http://support.verizonwireless.com/clc/devices/knowledge_base.html?id=51309 e lo vedo nel registro 'W/BackupManagerService (196): Backup pass ma e = true p = false', che significa abilitato ma non predisposto. Perché non è fornito? – mollymay

+1

Ho ricevuto questo problema oggi. onBackup chiamato con successo senza eccezioni, ma onRestore non viene chiamato quando l'app viene reinstallata. Hai scoperto il motivo? Grazie! – Loc

risposta

1

Nella mia esperienza, per qualche strano motivo (che Devo ancora identificarmi), le dichiarazioni di registrazione eseguite in BackupAgent non vengono visualizzate nei log. Tuttavia, sono stato in grado di confermare che il metodo onRestore è in effetti eseguito correttamente.

Nella domanda si indica che il metodo onRestore "non sembra essere chiamato" perché non è possibile visualizzare i registri appropriati. Puoi invece confermare che il risultato non sta funzionando (ovvero che i dati che dovrebbero essere correttamente ripristinati non lo sono)?

+0

Vero. Penso che l'OP dovrebbe controllare questo e tornare indietro. –

+0

In base alla mia esperienza, in Android 5 vengono chiamate istruzioni di registrazione, ma i punti di interruzione del debug non vengono attivati. Sembra che il processo di ripristino venga eseguito prima che il debugger sia connesso. Ciò potrebbe creare confusione su ciò che accade durante il test di un'app. – arlomedia

1

Ho avuto questo problema e la causa principale era che avevo un bug nel mio onBackup che impediva il completamento, quindi è stato chiamato onBackup ma onRestore non lo era.Risolvere l'eccezione in onBackup ha causato la chiamata di onRestore.

Registra anche i messaggi in onBackup e onRestore nei registri. Se si imposta un filtro di registro sul tag "backup" e si utilizza qualcosa con backup in esso per il tag di registro. Vedrai la registrazione dal sistema e dal tuo. Ecco quello che ottengo

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] 
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. 

nel registro sopra com.catglo.sellpr è dalla mia app e la riga che legge com.catglo.sellpr I/backup: onBackup chiamato è il messaggio di registro nel mio codice . Per l'OnRestore ottengo

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 

prima avevo un'eccezione nel onBackup e il mio registro dal OnRestore è mai stato chiamato, ma i messaggi di sistema relativi al ripristino erano.

L'applicazione non forzerà la chiusura a causa di un'eccezione nel backup.

Problemi correlati