android Data Backup(下)
来源:互联网 发布:淘宝美工培训视频 编辑:程序博客网 时间:2024/05/29 17:56
执行恢复
恢复程序数据时,备份管理器将调用备份代理的onRestore()方法。调用此方法时,备份管理器会把备份的数据传入,以供恢复到设备中去。
只有备份服务器能够调用onRestore(),在系统安装应用程序并且发现有备份数据存在时,调用会自动发生。不过,也可以通过调用requestRestore()来发起恢复数据的请求(详情参阅请求恢复)。
注:
当备份管理器调用onRestore()
data
BackupDataInput对象,用以读取备份数据。
appVersionCode
整数,表示备份数据时应用程序manifest中的android:versionCode属性。可以用于核对当前程序版本并确定数据格式的兼容性。关于利用此版本号来处理不同版本恢复数据的详细情况,请参阅下文检查恢复数据的版本。
newState
已打开的,可读写的文件描述符ParcelFileDescriptor,指向一个文件,这里必须写入最后一次提交data数据的备份状态。本对象在下次调用onBackup()时作为oldState
在实现onRestore()时,应该对data
1.
2.
1.
2.
3.
3.
下面是把前一节例子中所备份的数据进行恢复的示例:
@Override
public
}
在以上例子中,传给onRestore()的appVersionCode
关于BackupAgent的完整例子,请参阅例程备份和恢复中的ExampleAgent类。
继承BackupAgentHelper
如果要备份整个文件(来自SharedPreferences或内部存储),应该用BackupAgentHelper创建备份代理来实现。因为不必实现onBackup()和onRestore()了,用BackupAgentHelper
BackupAgentHelper
·
·
在BackupAgentHelper中可包含多个helper,但对于每种数据类型只需用到一个helper
对于每个要加入BackupAgentHelper的helper,必须在onCreate()
1.
2.
下一节描述了如何使用每种helper创建备份代理。
备份SharedPreferences
实例化SharedPreferencesBackupH
例如,假设需备份的SharedPreferences文件名为“user_preferences”,完整的使用BackupAgentHelper的备份代理代码类似如下:
public
}
好,这就是一个备份代理的完整实现。SharedPreferencesBackupH
当备份管理器调用onBackup()
注:
备份其它文件
在实例化FileBackupHelper时,必须包含一个或多个保存于程序内部存储中的文件名称。(路径的描述方式类似getFilesDir(),并且作为openFileOutput()
比如,需要备份两个名为“scores”和“stats”的文件,备份代理使用BackupAgentHelper
public
}
FileBackupHelper
但是,读写内部存储文件不是线程安全的。要确保activity操作文件的时候备份代理不会去读写文件,每次读写文件时必须使用同步语句。比如,Activity读写文件时,需要用一个对象作为同步语句的内部锁。
//
static
有趣的事实:长度为零的数组要比普通对象更轻量化,因此用作内部锁会是个好主意。
然后,每次读写文件时用这个锁创建同步语句。以下是把游戏分数写入文件的同步语句示例:
try
}
}
应该用同一个锁同步读取文件的语句。
然后,在BackupAgentHelper内,必须覆盖onBackup()和onRestore()方法,用同一个内部锁同步备份和恢复操作。比如,上例中MyFileBackupAgent需要以下方法:
@Override
public
}
@Override
public
}
好了,所有要做的工作仅仅是在onCreate()方法内加入FileBackupHelper,覆盖onBackup()和onRestore()
关于用FileBackupHelper实现BackupAgentHelper的例子,请参阅例程备份和恢复中的FileHelperExampleAgent
检查恢复数据的版本
在把数据保存到云存储中去时,备份管理器会自动包含应用程序的版本号,版本号是在manifest文件的android:versionCode
用android:restoreAnyVersion属性可以取代以上规则。此属性用“true”或“false”标明是否在恢复时忽略数据集的版本,默认值是“false”。如果将其设为“true”,备份管理器将忽略android:versionCode
为了便于在恢复数据时对版本号进行判断处理,onRestore()把备份数据的版本号作为appVersionCode
PackageInfo
try
}
}
int
if
}
然后,简单比较一下PackageInfo
警告:请确认已经理解了android:restoreAnyVersion
请求备份
任何时候都可以通过调用dataChanged()来发起备份请求。此方法通知备份管理器用备份代理来备份数据。然后,备份管理器将会适时调用备份代理的onBackup()方法。通常每次数据发生变化时都应该请求备份数据(比如用户修改了需保存的程序配置)。如果在备份管理器实际执行前连续调用了dataChanged()很多次,代理仅会执行一次onBackup()。
注:
请求恢复
在程序正常的生命周期内,应该不需要发起恢复数据的请求。在程序安装完成时,系统会自动检查备份数据并执行恢复操作。不过必要时,也可以通过调用requestRestore()来人工发起恢复数据的请求。这时,备份管理器会调用onRestore(),并把现有备份数据集作为数据传入该方法。
注:在程序开发过程中,可以用bmgrtool发起恢复数据的请求。
测试备份代理
一旦实现了备份代理,就可以用bmgr按以下步骤测试备份和恢复功能了:
1.
o
o
2.
o
adb shell bmgr enable true
o
3.
如果程序已经正确地实现了备份代码,那每次数据变化时都会请求备份。例如,每当用户改变了一些数据,程序将调用dataChanged(),这就往备份管理器的请求队列里加入了一个备份请求。出于测试的目的,也可以用以下bmgr命令发起一个请求:
adb shell bmgrbackup
4.
adb shell bmgr run
这一步强迫备份管理器执行所有已入队列的备份请求。
5.
adbuninstall
6.
如果备份代理成功运行,那第4步里备份的数据将会被恢复。
补充
- android Data Backup(下)
- android Data Backup(上)
- Android数据备份(Android Data Backup)
- Android数据备份(Android Data Backup)
- Android: Data Backup
- Android-Data Backup
- Android API Guides---Data Backup
- Android数据存储---数据备份(Data Backup)(一)
- Android数据存储---数据备份(Data Backup)(二)
- Android数据存储---数据备份(Data Backup)(三)
- Android数据存储---数据备份(Data Backup)(一)
- Android数据存储---数据备份(Data Backup)(二)
- Android数据存储---数据备份(Data Backup)(三)
- 使用android backup service将app data同步到云
- Android开发指南(37) —— Data Backup
- 使用android backup service将app data同步到云
- Android开发指南(37) —— Data Backup
- Android开发者指南-数据备份Data Backup[原创译文]
- JAVA计算文件的MD5值
- DownloadManager下载管理
- BroadCastReceiver 静态动态注册
- android Data Backup(上)
- J2EE技术规范(四)——JSP基础
- android Data Backup(下)
- 关注
- Android开发者指南-Property…
- C++中简单图操作
- 类似前序遍历 建立二叉树
- Gps 框架调用时序图
- Android Input framework(一)
- Android Input Framework(二)---EventHub
- Shiro 权限框架使用总结