9.4.2 云端存储的使用

在Android中实现云端存储,需要在应用中添加一个组件。该组件派生自android.app.backup.BackupAgent类,BackupAgent同样继承自Context类,从运行模式来看,和界面组件、服务组件相仿,都由系统控制其生命周期,本书称为云端存储组件。

在实践中,Android会构造一个派生自BackupAgent的子类android.app.backup.BackupAgentHelper的对象,来更方便地构建云端存储组件。示例如下:


public class MyBackupAgent extends BackuAgentHelper{

private static final String KEY="my_backup";

public void onCreate(){

//构造文件读写对象,声明需要备份的文件

FileBackupHelper helper=new FileBackupHelper(

this,"backup_file");

addHelper(KEY, helper);

}

public void onBackup(ParcelFileDescriptor oldState,

BackupDataOutput data,

ParcelFileDescriptor newState)throws IOException{

//调用父类方法,提交整个文件到云端

super.onBackup(oldState, data, newState);

}

public void onRestore(BackupDataInput data,

int appVersionCode,

ParcelFileDescriptor newState)throws IOException{

//调用父类方法,将从云端获取的文件覆盖本地文件

super.onRestore(data, appVersionCode, newState);

}

};


BackupAgentHelper的设计采取了策略模式,将组件的生命周期控制与文件的同步实现隔离开来,使之独立变化。具体的文件同步实现由android.app.backup.BackupHelper接口的对象来完成,上例利用了BackupAgentHelper.addHelper函数将android.app.backup.FileBackupHelper添加成为同步的实现者,它将文件作为同步对象。如果需要与云端同步的文件是应用设置文件,则可以将android.app.backup.SharedPreferencesBackupHelper对象添加到云端存储组件中。此外,开发者也可以自行实现BackupHelper接口,来自定义需要同步的行为。

从生命周期来看,当本地数据发生变化需要提交时,会通过BackupAgent.onBack函数,将数据从本地读取出来提交到云端。Android不会自行将数据提交到云端,开发者需要显性调用android.app.backup.BackupManager的dataChanged函数来触发:


BackupManager manager=new BackupManager(this);

manager.dataChanged();


而当应用的本地数据与云端的同步时,则由系统自行控制,Android会在合适的时机调用云端存储组件的onRestore函数,将存储在云端的数据同步到本地。开发者也可以调用BackupManager.requestRestore函数请求同步:


BackupManager manager=new BackupManager(this);

manager.requestRestore(new RestoreObserver(){

void onUpdate(int nowBeingRestored, String currentPackage){

//监听进度

}

void restoreFinished(int error){

//同步结束

}

void restoreStarting(int numPackages){

//同步开始

}

});


和其他所有组件一样,云端存储组件是由系统进行托管的。这就需要把组件的相关信息放入配置文件中,否则将无法生效。与一般的组件不同,每个应用中只能有一个云端存储组件,因此,云端存储组件的声明在application元素下,一个示例如下:


<application android:backupAgent="MyBackupAgent"

…>


需要特别注意的是,目前Android的云端存储还处于初级阶段,具备云端存储支持的设备、机型等不够广泛,因此,不能用来存储应用的帐号、密码等核心数据。并且,Android并没有为其他平台和设备提供云端存储的接口,所以,跨平台的应用无法通过此方式来共享数据。此外,Android的云端同步和备份并不具有实时性,这也就不能满足应用实时同步数据的需求。

综上所述,在目前阶段,Android的云端存储技术仅适合作为本地设置信息的辅助支持模块,存储应用的附属数据,在满足约束条件的前提下用来提升用户体验。