我的自定义BackupAgent没有调用onRestore方法

21

我在我的Android应用程序中有一些数据需要备份和恢复。为此,我创建了一个自定义实现的BackupAgent

在我的清单文件中,我已经包括了备份代理,如下所示:

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

尽管我正在使用模拟器(Android 2.2),而且它应该不必要,因为它使用本地备份传输,但我已经包含了备份服务api密钥。

为了测试备份和恢复,我已经执行了以下操作:

  • 启动已安装我的应用程序的模拟器。
  • 启用备份

    adb shell bmgr enable true

  • 调用我的代码部分,其中BackupManager类中的dataChanged方法被调用。

  • 手动启动备份操作

    adb shell bmgr run

  • 在日志中检查自定义BackupAgent的onBackup方法是否被调用。

  • 卸载应用程序
  • 重新安装应用程序
  • 检查日志,看看是否调用了onRestore方法。

问题是onRestore方法似乎没有被调用,我不知道原因。在重新安装应用程序或使用adb手动触发还原后,我在控制台中看到以下内容。

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

并且这个在日志中

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 observer=android.app.backup.IRestoreObserver$Stub$Proxy@450e16a8
V/LocalTransport(   59): start restore 1
V/LocalTransport(   59):   nextRestorePackage() = @pm@
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):     ... key=@meta@ size=11
V/LocalTransport(   59):   no more packages to restore
V/LocalTransport(   59): finishRestore()
V/LocalTransport(   59): finishRestore()
D/AndroidRuntime( 8259): Shutting down VM

但我并没有看到实际调用onRestore方法(我在该方法一开始加了一些日志语句)?

这种情况发生过吗?是否有任何原因导致onRestore方法没有被调用,即使onBackup方法已被调用?


2
我刚刚也用了一部适当的手机,三星Galaxy Nexus。我确保已启用备份,就像以下链接中描述的那样:http://support.verizonwireless.com/clc/devices/knowledge_base.html?id=51309,并且在日志中看到了这个`W/BackupManagerService( 196): Backup pass but e=true p=false`,这意味着已启用但未供应。为什么没有供应? - mollymay
1
今天我遇到了这个问题。onBackup 被成功调用且没有异常,但是在重新安装应用后 onRestore 没有被调用。你找到原因了吗?谢谢! - LHA
2个回答

1
根据我的经验,备份代理中记录的日志语句出现了一些奇怪的问题(我还没有找到原因),这些语句并没有在日志中显示。尽管如此,我已经确认onRestore方法确实被正确执行。
在你的问题中,你指出onRestore方法“似乎没有被调用”,因为你无法看到正确的日志。你能否确认结果失败了(即应该被恢复的数据没有被恢复)?

正确。我认为原帖作者应该检查一下并回复。 - Dheeraj Bhaskar
根据我的经验,在Android 5中,日志语句会被调用,但是调试断点却不会触发。看起来恢复过程在调试器连接之前就已经运行了。这可能会在测试应用程序时造成一些混淆。 - arlomedia

1
我曾遇到这个问题,根本原因是我的 onBackup 方法中有一个错误导致它未能完成,因此虽然调用了 onBackup 方法,但 onRestore 方法并没有被调用。修复 onBackup 中的异常后,onRestore 方法得以被调用。
此外,在 onBackup 和 onRestore 中使用 Log 消息会在日志中显示。如果你将标签过滤器设置为“backup”,并使用带有 backup 的内容作为你的记录标签,则可以看到系统和你自己的日志记录。这是我得到的:
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 agent=android.app.backup.BackupAgent$BackupServiceBinder@4112a228
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' android.app.backup.WallpaperBackupHelper@41149150
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 agent=android.os.BinderProxy@410768c8
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.

在上面的日志中,com.catglo.sellpr是我的应用程序,并且读取com.catglo.sellpr I/backup﹕ onBackup called的行是我的代码中的日志消息。对于onRestore,我得到了...
09-08 17:13:34.431      294-352/system_process D/BackupManagerService﹕ MSG_RUN_RESTORE observer=android.app.backup.IRestoreObserver$Stub$Proxy@413132c0
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 agent=android.os.BinderProxy@41127ee0
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

之前在onBackup里出现了异常,但是我的onRestore日志没有被调用,但与恢复相关的系统消息确实被记录下来了。

即使备份出现异常,该应用程序也不会强制关闭。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接