我的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" />
我已经包含了备份服务api密钥,虽然我正在使用模拟器(Android 2.2)进行测试,但它并不是必需的,因为它使用本地备份传输 .
为了进行备份和恢复的测试,我已经完成了以下操作:
-
在安装了我的应用程序的情况下启动模拟器 .
-
启用备份
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 回答
根据我的经验,由于一些奇怪的原因(我尚未确定),BackupAgent中的日志语句不会显示在日志中 . 尽管如此,我已经能够确认onRestore方法 is 实际上正确运行 .
在您的问题中,您指出onRestore方法“似乎没有被调用”,因为您无法看到正确的日志 . 你能否确认结果是否失败(即应该正确恢复的数据不是)?
我有这个问题,根本原因是我的onBackup中有一个错误阻止它完成,所以onBackup被调用但是onRestore没有 . 修复onBackup中的异常导致onRestore被调用 .
此外,onBackup和onRestore中的日志消息也会显示在日志中 . 如果在标记“backup”上设置日志过滤器,并在其中使用带备份的内容作为日志标记 . 您将看到来自系统和您的日志记录 . 这是我得到的
在上面的日志中,com.catglo.sellpr来自我的应用程序和读取com.catglo.sellpr的行/备份:onBackup被调用是我代码中的日志消息 . 对于onRestore,我得到了
之前我在onBackup上有一个例外,我的onRestore日志从未被调用,但与恢复相关的系统消息是 .
由于备份中的异常,应用程序不会强制关闭 .