- Android 系统概述
- 什么是智能手机?智能手机操作系统有哪些?
- Android(安卓)是什么?
- Android 系统架构(图解)
- Android 7 新特性介绍
- Android 开发环境搭建
- Android 开发环境搭建教程(图解)
- Android SDK 是什么?
- 通过 Android Studio 创建 Android 应用程序(附带解析)
- Android Studio 的基本调试
- Android 应用程序结构:Android 组件和资源详解
- Android 四大核心组件:Activity+Service+BroadcastReceiver+ContentProvider
- Android Activity 组件及其生命周期
- Android 资源(res 和 assets 目录)
- AndroidManifest.xml 配置文件详解
- Android App Widgets 组件详解
- Android 系统的进程和线程
- Android GUI(图形用户界面)开发
- Android View 和 ViewGroup
- Android 使用 XML 文件定义用户界面
- Android 五大布局:FrameLayout、LinearLayout、AbsoluteLayout、RelativeLayout 和 TableLayout
- Android 创建 Widget 组件实例详解
- Android Button:按钮控件
- Android CheckBox:多选按钮控件
- Android RadioGroup:单选按钮控件
- Android TextView:文本框控件
- Android EditText:编辑框控件
- Android Spinner:下拉列表控件
- Android AutoCompleteTextView:自动完成文本框控件
- Android DatePicker 和 TimePicker:时间日期选择器
- Android ProgressBar:进度条控件
- Android ScrollView:滚动视图
- Android SeekBar:拖动条控件
- Android RatingBar:评价条控件
- Android ImageView 和 ImageButton:图片视图和图片按钮
- Android ImageSwitcher 和 Gallery:图片切换器和图库
- Android GridView:网格视图
- Android Tab:面板标签控件
- Android 菜单:选项菜单+上下文菜单+子菜单
- Android Bitmap(点阵图像、绘制图像)
- Android 对话框(AlertDialog+ProgressDialog)
- Android 多窗口模式(分屏模式)
- Android 事件监听器和回调方法
- Android 电话短信拍照开发教程
- Android Intent:不同应用程序之间通信的桥梁
- Android 实现拨打电话功能
- Android 实现接收短信和发送短信功能
- Android 调用相机进行拍照
- Android 多媒体开发
- Android Service 生命周期和使用方法
- Android BroadcastReceiver:接收广播
- Android 音频以及音频播放器开发实例
- Android MediaRecorder 录制音频
- Android 视频以及视频播放器实例
- Android Camera 相机以及相机程序开发实例
- Android MediaRecorder 录制视频
- Android 数据存储(SQLite 数据库、Android App 数据备份和恢复 )
- Android 数据存储之 SharedPreferences
- Android 数据存储之文件存储
- Android 使用 SQLite 数据库存数数据
- Android SQLite 数据库操作实例
- Android ContentProvider(内容提供者)
- Android 使用系统提供的 ContentProvider
- Android 自定义 ContentProvider
- Android 使用自定义 ContentProvider
- Google App Engine 是什么?
- Android APP 数据备份与恢复
- Android BackupAgent 实现数据备份与恢复
- Android BackupAgentHelper 实现数据备份与恢复
- Android 网络编程
- 借助 GPE 让 Android APP 和 Google App Engine 通信
- Android HTTP 通信
- Android HttpURLConnection 访问互联网资源
- Android 通过 GET 方式获取互联网资源
- Android 通过 POST 方式获取互联网资源
- Android Socket 编程(附带实例)
- Bluetooth(蓝牙)是什么?
- Android 蓝牙通信开发教程(详解版)
- Android 蓝牙通信开发实例演示
- WIFI(无线局域网)是什么?
- Android WiFi 开发(WiFi 编程)实例演示
- WIFI Direct(WIFI 直连)是什么?
- Android WIFI Direct 开发教程
- Android WIFI Direct 开发实例演示
- NFC(近场通信)是什么?
- Android NFC 开发教程
- Android USB 开发简介
- Android USB 附件模式开发教程
- Android USB 主机模式开发教程
- Android SIP 开发教程
- Android 智能传感器
- LBS(位置服务)和 GPS(全球定位系统)简介
- Android LBS 位置服务开发简介
- Android GPS 定位开发教程
- Google Map API 开发简介
- Android Google Map API Key 详细申请步骤
- Google Map API 开发 Android 地图应用实例
- Android 传感器开发教程
- Android 运动传感器开发教程
- Android 位置传感器开发教程
- Android 环境传感器开发教程
- Android 绘图(2D 绘图、3D 绘图)
- Android 2D 绘图开发简介
- Android 使用自定义 View 绘图
- Android 使用 Bitmap 绘图
- Android 使用 SurfaceView 绘制静态图像
- Android 使用 SurfaceView 绘制动态图像
- Android Drawable 开发简介
- Android 3D 绘图开发简介
- Android 硬件加速开发简介
- Android RenderScript 开发简介
- Android App 的国际化和本地化
- Android 国际化和本地化开发简介
- Android 手机区域设置详细步骤
- Android 未本地化应用开发教程
- Android 本地化应用开发教程
- Android 文本输入与复制粘贴
- Android 剪贴板框架开发简介
- Android 剪贴板数据转文本开发简介
- Android 复制粘贴开发教程
- Android Content Provider 复制复杂数据开发教程
- Android 一键复制粘贴开发实例
- Android 企业级应用开发
- Android 设备管理 API 概述
- Android 开发设备管理 API 应用教程
- Android 文本语音 API 开发教程
- Android TV 应用开发教程
- Android TV 应用开发实例
- Android 可穿戴设备应用开发教程
- Android 应用程序的发布
- Android 应用程序发布的步骤
- Android 为什么要为应用程序签名?
- Android 导出未签名应用程序开发步骤
- Android 生成签名文件开发教程
- Android 应用程序签名开发教程
- zipalign 工具优化应用程序开发简介
- Google Play Store( Android Market)发布简介
Android BackupAgentHelper 实现数据备份与恢复
上一节教程我们学习了怎么使用 BackupAgent 实现 Android 数据备份与恢复,这一节我们主要介绍如何使用 BackupAgentHelper 实现 Android 数据备份与恢复。
1) 实现 BackupAgentHelper
如果要备份整个 SharedPreferences 和内部存储文件,就应该使用 BackupAgentHelper 的子类创建备份代理,这种方式不需要实现 onBackup() 和 onRestore() 方法,因此可以比使用 BackupAgent 实现的方式大幅度地降低代码量。
BackupAgentHelper 的实现必须要使用一个或多个 backup helper。backup helper 是一种专用组件,BackupAgentHelper 用它来对特定类型的数据执行备份和恢复操作。
Android 框架目前提供两种 helper,分别为:
- SharedPreferencesBackupHelper 用于备份 SharedPreferences 文件。
- FileBackupHelper 用于备份内部存储文件。
BackupAgentHelper 对象中可包含多个 helper,但对于每种数据类型只需用到一个 helper。也就是说,即使存在多个 SharedPreferences 文件,也只需要一个 SharedPreferences-BackupHelper 即可完成对文件的备份与恢复。
要在 BackupAgentHelper 中加入 helper,需要在 onCreate() 方法中执行以下步骤:
1) 实例化所需的 helper,并在其构造方法中指定要备份的文件。
2) 调用 addHelper() 方法,把 helper 加入 BackupAgentHelper。
使用 SharedPreferencesBackupHelper 备份 SharedPreferences 的相关代码如下:
public class MyPrefsBackupAgent extends BackupAgentHelper {
// The name of the SharedPreferences file
static final String PREFS="user_preferences";
// A key to uniquely identify the set of backup data static final String PREFS_BACKUP_KEY="prefs";
// Allocate a helper and add it to the backup agent @Override
public void onCreate(){
SharedPreferencesBackupHelper helper=new SharedPreferencesBackupHelper (this, PREFS); addHelper (PREFS_BACKUP_KEY, helper);
}
}上面的这几行代码实现了一个完整的备份代理 MyPrefsBackupAgent。
- user_preferences 是要备份的文件名称。
- SharedPreferencesBackupHelper 对象包含备份和恢复 SharedPreferences 文件的所有代码,不再需要开发者人为书写。
- 当备份管理器调用 onBackup() 方法和 onRestore() 方法时,MyPrefsBackupAgent 会调用 helper 来完成对指定文件的备份和恢复操作。
由于 SharedPreferences 是线程安全的,因此可以从备份代理和其他 Activity 中安全地读写 shared preferences 文件。
使用 FileBackupHelper 备份内部存储文件的相关代码如下:
public class MyFileBackupAgent extends BackupAgentHelper {
// The name of the files
static final String TOP_SCORES="scores";
static final String PLAYER_STATS="stats";
// A key to uniquely identify the set of backup data static final String FILES_BACKUP_KEY="myfiles";
// Allocate a helper and add it to the backup agent void onCreate(){
FileBackupHelper helper=new FileBackupHelper (this, TOP_SCORES, PLAYER_STATS);
addHelper (FILES_BACKUP_KEY, helper) ;
}
}其中,scores 和 stats 是要保存的文件名字,上面的代码定义的 helper 同时对两个文件进行备份和恢复操作。
需要注意的是,由于读写内部存储文件不是线程安全的,因此要确保当 Activity 在进行文件操作时,备份代理不会去读写该文件,每次读写文件时应该使用同步语句。
比如在 Activity 读写文件时,需要用一个对象作为同步语句的内部锁。事实证明,长度为零的数组要比普通对象更轻量化,更适合作为对象锁使用。
创建对象锁的代码如下:
// 内部锁对象
static final Object[] sDataLock=new Object[0];
然后,每次读写文件时就用这个锁对象创建同步语句。把游戏分数写入文件的同步代码如下:
try {
synchronized (MyActivity.sDataLock) {
File dataFile=new File (getFilesDir(), TOP_SCORES);
RandomAccessFile raFile=new RandomAccessFile (dataFile,"rw");
raFile.writeInt (score);
}
} catch (IOException e) {
Log.e (TAG,"Unable to write to file") ;
}当读文件时,也应该使用同一个锁对象创建同步语句。
然后,需要覆盖 BackupAgentHelper 的 onBackup() 和 onRestore() 方法,用同一个内部锁同步备份和恢复操作。
上例中定义的 MyFileBackupAgent 需要添加以下方法:
@Override
public void onBackup (ParcelFileDescriptor oldState, BackupDataOutput data, ParcelFileDescriptor newState) throws IOException {
//Hold the lock while the FileBackupHelper performs backup
synchronized (MyActivity.sDataLock) {
super.onBackup (oldState, data, newState);
}
}
@Override
public void onRestore (BackupDatalnput data, int appVersionCode, ParcelFileDescriptor newState) throws IOException {
//Hold the lock while the FileBackupHelper restores the file
synchronized (MyActivity.sDataLock) {
super.onRestore (data, appVersionCode, newState);
}
}至此,完成了使用 FileBackupHelper 进行文件备份和恢复操作的全部工作。
2) 核实恢复数据的版本
在把数据备份到云存储的过程中,备份管理器会自动包含应用程序的版本号。
版本号是由 manifest 文件中的 android:versionCode 属性定义的。在调用备份代理恢复数据之前,备份管理器会查询已安装程序的 android:versionCode 属性,并与记录在备份数据中的版本号相比较。
如果备份数据的版本比设备上高,就意味着用户安装了旧版本的应用程序。这时备份管理器将停止数据恢复操作,onRestore() 方法也不会被调用,因为把数据恢复给旧版本的应用程序是没有意义的。
通过 android:restoreAnyVersion 属性可以替换以上规则。此属性用 true 或 false 标明是否在进行数据恢复时核实数据集的版本。
- 默认值是 false。
- 值为 true 时,备份管理器将忽略 android:versionCode 属性并且调用 onRestore() 方法。这时候应该在 onRestore() 方法中人工核实版本信息,并在版本冲突时采取必要的措施保证数据的兼容性。
为了便于在恢复数据时对版本号进行判断,onRestore() 方法把备份数据的版本号作为 appVersionCode 参数和数据一起传入方法中。
通过 PackageInfo.versionCode 可以查询到当前应用程序的版本号,相关代码如下:
PackageInfo info;
try {
String name=getPackageName();
info=getPackageManager().getPackageInfo(name,0);
}catch(NameNotFoundException nnfe){
info=null;
}
int version;
if(info !=null){
version=info.versionCode;
}然后比较一下传入 onRestore() 方法的 appVersionCode 和 PackageInfo 的 version 值即可。
3) 请求数据备份
应用程序在任何时候都可以通过调用 dataChanged() 方法来发起备份请求。
dataChanged() 方法将通知备份管理器用备份代理来备份数据。
备份管理器将会在合适的时候调用备份代理的 onBackup() 方法。
通常每次数据发生变化时都应该请求备份数据,但是实际的备份次数比请求次数少得多。
如果在备份管理器执行备份操作前连续请求了很多次,备份代理仅会执行一次数据备份操作。
4) 请求数据恢复
在应用程序正常的生命周期内,应该不需要发起恢复数据的请求。在程序安装完成时,系统会自动检查备份数据并执行数据恢复操作。
在必要时,可以通过调用 requestRestore() 方法人工发起恢复数据的请求。这时,备份管理器会调用 onRestore() 方法进行数据恢复。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论