第十五篇 Android 的Backup服务管理机制--助手模式

来源:互联网 发布:php是最好的语言出处 编辑:程序博客网 时间:2024/05/16 07:50

Android2.2以后的备份服务功能可以允许用户备份应用数据到云存储中,当应用执行了工厂恢复服务或者转换到一个新的平台上时,如果备份的应用重新安装,系统就自动恢复原先备份的数据,这个过程对用户是完全透明的。GOOGLE目前为Android框架系统提供了一个云存储服务BackupTransportService和一个GOOGLE Backup Transport对象,不过要使用云存储,需要首先向该服务登记你要备份的应用,获得一个Backup Service Key,并以如下格式包括在你要备份的应用的manifest工程文件中。当然你也可以实现你自己的云存储服务和一个备份IBackupTransport对象,或者使用其它第三方云存储服务。Android框架系统也提供了一个供测试的本地IBackupTransport对象。

<meta-dataandroid:name="com.google.android.backup.api_key" 
           android:value="your_backup_service_key"/>

 

 

 

 

      Android4.0以上版本又增加了对应用包的全部备份和恢复功能。

      备份和恢复服务功能通过BackupManagerService系统服务完成,下图是备份管理服务BackupManagerService的类图。    

       

       BackupManagerService服务主要通过六个binder接口(其中包括两个观察对象接口)及四个实现备份和恢复过程的类对外提供服务。

       BackupManagerServiceIBackupManager.Stub的派生对象,实现应用及数据的备份和恢复过程。

BackupManagerService通过IbackupTransport接口通过binder调用实现备份数据的上传和下载。

       应用程序客户端通过BackupManager对象向BackupManagerService服务发出应用数据备份和恢复的请求。

       BackupManager对象在发出备份和恢复的请求之前需要先调用checkServiceBinder函数单例化一个IbackupManager客户端代理对象,通过该对象向BackupManagerService服务发出备份或恢复请求。

        应用数据备份请求通过调用BackupManager对象的dataChanged函数发出。dataChanged函数先调用checkServiceBinder函数获得IbackupManager客户端代理对象后,接着调用服务端的dataChanged同名函数发出备份请求。

       应用数据恢复请求通常由系统在应用安装时发现有要恢复的数据时自动触发,PackageManagerService服务在安装包成功后时发现新安装包不是一个更新包且应用包的工程文件包含backupAgent标示时触发恢复请求。当然用户也可以调用BackupManager对象的requestRestore函数来手工发出一个恢复请求。requestRestore函数同样先调用checkServiceBinder函数获得IbackupManager客户端代理对象,然后调用服务端的beginRestoreSession函数实例化一个ActiveRestoreSession桩对象,并返回客户端一个IrestoreSession类型的binder接口对象,并根据该binder对象实例化一个客户端RestoreSession对象,通过RestoreSession对象使用IrestoreSession接口向服务端发出恢复请求。

        应用包的全部备份和恢复功能目前只能采用命令方式触发,触发时弹出一个用户确认框(一个系统实现的BackupRestoreConfirmation活动)让用户确认,只有用户确认后才能触发应用包的全部备份和恢复功能。

     备份和恢复任务的实现主要采用了模板和代理及助手设计模式,BackupManagerService中主要提供了备份和恢复任务的实现模板,具体备份数据的提供及具体的备份恢复方法通过用户提供的BackupAgent对象提供,备份和恢复任务的实现模板通过钩子调用BackupAgent对象的回调函数完成要备份数据的备份和恢复。

        BackupManagerService中备份和恢复任务的实现模板通过四个类提供。应用数据的备份和恢复任务的实现模板通过PerformBackupTaskPerformRestoreTask两个对象(都是BackupRestoreTask接口的实现)执行,两个对象分别包括相应的应用数据备份和恢复请求的处理函数,根据不同的请求以及当前的状态执行不同的过程。如PerformBackupTask对象和PerformRestoreTask对象都提供了一个execute函数用于执行主要的备份和恢复步骤,execute函数根据备份和恢复过程的当前状态执行不同的函数。

       备份和恢复任务都包括几个子过程。备份任务包括启动备份阶段、开始备份阶段、完成备份阶段三个阶段。在启动备份阶段使用PackageManagerBackupAgent对象备份所有要备份应用包的基本信息(包的版本信息和签名信息);在开始备份阶段执行每一个备份请求,对于每一个备份请求首先调用应用对应的BackupAgent对象把备份数据保存到缓冲区,操作完成后通知BackupManagerService调用BackupTransport对象的performBackup函数完成实际的备份;在完成备份阶段完成备份的后续处理,如写RestoreTokenToken文件,为下一次备份做准备等。

        恢复任务过程包括初始阶段、下载数据阶段、恢复应用包的基本信息阶段、执行恢复请求阶段、完成阶段等五个阶段。

        PerformFullBackupTask对象及PerformFullRestoreTask对象以及两者的内部对象FullBackupRunnerRestoreFileRunnable共同提供了实现全部应用包的备份和恢复的实现模板。四个对象都是Runnable对象,因此运行于独立的线程。FullBackupRunnerRestoreFileRunnable对象执行系统包的备份和恢复任务。

         BackupManagerService服务还包含两个观察者对象接口:IFullBackupRestoreObserverIRestoreObserver

        IFullBackupRestoreObserver用于全部备份和恢复过程的过程事件的监视。IFullBackupRestoreObserver的桩实现对象FullObserverBackupRestoreConfirmation活动的内部类,全部备份和恢复过程产生的事件通过IFullBackupRestoreObserver接口调用FullObserver的相关函数向BackupRestoreConfirmation报告备份和恢复的过程事件

         IRestoreObserver用于应用数据的备份和恢复。IRestoreObserver的桩实现对象位于客户端RestoreSession类中,是RestoreSession类的一个内部包装类RestoreObserverWrapper(实现RestoreObserver对象的包装),以此实现通知事件的异步发送。应用数据备份和恢复过程产生的事件先调用RestoreObserverWrapper相关函数发给RestoreObserverWrapperRestoreObserverWrapper的相关函数通过消息发送机制把事件转发给RestoreObserver对象。

       完成应用数据实际备份和恢复任务及实际数据提供的BackupAgent对象由用户在应用程序中提供,并在应用的工程文件中的application标签下用android:backupAgent属性指定该BackupAgent对象。

    <application android:label="MyApplication"

                android:backupAgent="MyBackupAgent">

    </application>

       BackupAgent是框架提供的一个抽象类,为应用与备份管理服务通讯提供了一个中心接口,BackupAgent类内部包括一个IBackupAgent接口的桩对象BackupServiceBinder,且BackupAgent类的每个回调函数也都包括一个IBackupManager接口参数,因此应用和BackupManagerService服务可以使用BackupAgent的这两种接口实现相互交互。

        BackupManagerService服务调用bindToAgentSynchronous函数借助ActivityManagerService实现应用包含的BackupAgent对象与应用进程的绑定和实例化,BackupAgent对象绑定和实例化后返回BackupAgent对象包含的一个IBackupAgent接口类型的 BINDER对象供BackupManagerService服务使用。 BackupManagerService服务使用该IBackupAgent接口调用BackupAgent对象的回调函数完成实际的备份和恢复工作(doBackupdoRestore等),完成实际备份和恢复工作后使用回调函数传进来的IBackupManager接口参数调用BackupManagerService服务的opComplete函数,通知本次备份和恢复工作的完成结果。

        应用可以采用两种方式实现一个 Backup Agent:一种方式是扩展BackupAgent类,并覆盖相应的回调方法,来实现特定功能的备份和恢复操作。浏览器应用实现书签备份功能的BrowserBackupAgent对象及系统提供的实现共享目录备份功能的SharedStorageAgent就是采用这种方式。

     更通用的方式是扩展BackupAgentHelper类,BackupAgentHelper类是BackupAgent类的包装类。扩展BackupAgentHelper类可以减少需要实现的代码量, 因为BackupAgentHelper类把备份和恢复操作提交给系统已经提供实现相应备份和恢复功能的备份助手类来完成,用户不需要自己实现onBackup() 和onRestore()系统当前提供了如下几个备份助手类来实现某些确定类型的数据的备份和恢复。

     如备份所有命名Shared PreferencesSharedPreferencesBackupHelper类。备份应用数据目录所有文件的FileBackupHelper类和AbsoluteFileBackupHelper类。实现Wallpaper备份的WallpaperBackupHelper类。

    助手类和BackupAgent类间的类图之间的关系见下图

        

       几个助手类都实现了BackupHelper接口,实现备份助手接口功能,并都派生自FileBackupHelperBase,实现备份文件的待上传CACAH文件的基本操作(如写文件文件等)。

     BackupAgentHelper类把备份恢复操作通过BackupHelperDispatcher对象提交给相应助手类。BackupHelperDispatcher对象内部维护一个BackupHelper对象集合,因此BackupAgentHelper的派生类可以同时使用几个BackupHelper对象完成实际的备份和恢复操作。

     SystemBackupAgentSettingsBackupAgentBackupAgentHelper类的派生类,分别实现系统管理数据(当前仅支持系统墙面)及系统和安全设置的备份和恢复。SystemBackupAgent使用了WallpaperBackupHelper助手类来实现相应功能。


原文地址:点击打开链接

原创粉丝点击